2011-04-29
第3章 型とクラス #1
| ![]()
さて、そろそろHaskellらしいところに入ってきたかな。
型を示すには、式 :: 型 と書く。
なんだか、いきなり前振りなしで「評価されていない式」って言葉が出てきた。Haskellの遅延評価のことを言っているのかもしれないが、唐突すぎるだろ。この本のこういう所は嫌だな。
Hugsの:typeコマンドを学んだ!
Hugsの:loadコマンドが、プログラム中ではimportと同じということを学んだ!
Bool型- 真偽値。
TrueとFalse。
- 真偽値。
Char型- 文字。シングルクォート。
String型- 文字列。ダブルクォート。
Int型- 固定精度整数。普通の32ビット符号付き整数。オーバーフローに注意。
Integer型- 多倍長整数。
- これ必要だよね。C#には長らくなかった。(.NET 4から標準ライブラリに入った)
- 多倍長整数。
Float型[T]型(T1, T2,...,Tn)型- タプル。要素は必ず有限。
- 要素0のタプルはunit。
- 要素1のタプルは禁止。
- タプル。要素は必ず有限。
Tin→Tout型- 関数。定義域が制限されていてもOK。
→を複数並べると、カリー化された関数を表す。→は右結合だからT1→T2→T3はT1→(T2→T3)と違いがない。- ただし
(T1→T2)→T3は違う型。こっちは関数を引数に取る関数になる。 - カリー化されていない多変数関数を定義したい場合はタプルを使って
(T1,T2,...,Tn)→Toutとやってもいいが、カリー化された関数のほうが柔軟。 - 0引数の関数は、遅延評価される値と違いがないので、
→Tという型の関数はない。T型があるだけ。 ()→Tという型は定義できるが、unitを引数に取るので0引数にはならない。(Hugsで試した。)- たぶん
T→のような戻り値がない関数も定義できないのではないだろうか。何らかの意味のない値(たとえばunit)を返すようにするとか。
- 関数。定義域が制限されていてもOK。
第2章 はじめの一歩
| ![]()
処理系としては、Haskell Platform 2011.2.0.1 および WinHugs をインストールしてある。
最初、test.hsをロードしようとしてエラーが出て困った。
ERROR file:test.hs:1 - Syntax error in declaration (unexpected symbol "x")
ちょっとぐぐったら原因判明。文字コードがBOMつきUTF-8だったのが問題だったらしい。基本的にはANSIまたはBOMなしUTF-8じゃないといけないようだ。ま、BOMつきUTF-8なんて使うドザが悪いというのはあるけど、それにしてもOSSの文字コードの扱いはいろいろ良くないところがあるよね。
- 練習問題1
- 2^3*4 = (2^3)*4 = 32
- 2*3+4*5=(2*3)+(4*5) = 26
- 2+3*4^5=2+(3*(4^5)) = 3074
- 練習問題2
- もちろんHugsでやってる。
- 練習問題3
-
N = a `div` length xs where a = 10 xs = [1,2,3,4,5]
実行してみたらエラーメッセージで分かるだろう。Syntax error in input (unexpected symbol "xs")
たぶんxsのインデントが悪い。空白を追加。Undefined data constructor "N"
Nが大文字だからエラーになっているっぽい。小文字にしてみる。
……もう一度問題文を見たら、'div'って書いてある。ここが間違いだったらしい。正しくはバッククォートを用いて`div`とやる(上では最初から`div`と書いてしまっていた)。
プログラミングHaskellを買った
| ![]()
- 作者: Graham Hutton,山本和彦
- 出版社/メーカー: オーム社
- 発売日: 2009/11/11
- メディア: 単行本(ソフトカバー)
- 購入: 12人 クリック: 461回
- この商品を含むブログ (112件) を見る
これから勉強していく。
まずは第1章を読んだ。が、プログラムなんだか数学なんだか。いきなりリストが出てきているし。qsortの定義は擬似コードなのか実コードなのかわからない。
- 練習問題1
- なんだこれ。外側のdoubleを適用した後2番目のdoubleを適用する、でいいのか?(内側のdoubleから適用するのと、外側のdoubleを適用した後1番目のdoubleを適用するのは、本文中に出てきたので)
- 練習問題2
sum [x] = x + sum [ ] = x- 練習問題3
qsort larger ++ [x] ++ qsort smallerってする。- 練習問題4
- ピボットと同じ値が捨てられてしまう。
qsort [2,2,3,1,1] = qsort [1, 1] ++ [2] ++ qsort [3] = (qsort [ ] ++ [1] ++ qsort [ ]) ++ [2] ++ (qsort [ ] ++ [3] ++ qsort [ ]) = [1, 2, 3]ってなる。つまり、ピボットとか関係なしに、sortしてuniqしたことになりそうだな。証明は……面倒くさい。
コメントを書く