Hatena::Grouphaskell

猫とC#について書く代わりにHaskellについて書くmatarilloの日記 このページをアンテナに追加 RSSフィード

2011-04-29

第3章 型とクラス #1

03:06 | 第3章 型とクラス #1 - 猫とC#について書く代わりにHaskellについて書くmatarilloの日記 のブックマークコメント

さて、そろそろHaskellらしいところに入ってきたかな。

型を示すには、式 :: 型 と書く。

なんだか、いきなり前振りなしで「評価されていない式」って言葉が出てきた。Haskell遅延評価のことを言っているのかもしれないが、唐突すぎるだろ。この本のこういう所は嫌だな。

Hugs:typeコマンドを学んだ!

Hugs:loadコマンドが、プログラム中ではimportと同じということを学んだ!

  • Bool
    • 真偽値。TrueFalse
  • Char
    • 文字。シングルクォート。
  • String
    • 文字列。ダブルクォート。
  • Int
    • 固定精度整数。普通の32ビット符号付き整数。オーバーフローに注意。
  • Integer
  • Float
    • 単精度浮動小数点数。普通の32ビットIEEE 754浮動小数点数。
      • だとすればNaN、+∞、-∞も値に含まれるはず。あとで出てくるかな?
  • [T]
  • (T1, T2,...,Tn)
    • タプル。要素は必ず有限。
      • 要素0のタプルはunit。
      • 要素1のタプルは禁止。
  • Tin→Tout
    • 関数。定義域が制限されていてもOK。
      • を複数並べると、カリー化された関数を表す。右結合だからT1→T2→T3T1→(T2→T3)と違いがない。
      • ただし(T1→T2)→T3は違う型。こっちは関数を引数に取る関数になる。
      • カリー化されていない多変数関数を定義したい場合はタプルを使って(T1,T2,...,Tn)→Toutとやってもいいが、カリー化された関数のほうが柔軟。
      • 0引数の関数は、遅延評価される値と違いがないので、→Tという型の関数はない。T型があるだけ。
      • ()→Tという型は定義できるが、unitを引数に取るので0引数にはならない。(Hugsで試した。)
      • たぶんT→のような戻り値がない関数も定義できないのではないだろうか。何らかの意味のない値(たとえばunit)を返すようにするとか。

第2章 はじめの一歩

01:35 | 第2章 はじめの一歩 - 猫とC#について書く代わりにHaskellについて書くmatarilloの日記 のブックマークコメント

処理系としては、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が大文字だからエラーになっているっぽい。小文字にしてみる。
あれ、エラー消えちゃった。引数なしの関数nを表示してみたら2って出るし。関数にするのは良くなかった?でもデータコンストラクタとか、まだ教科書に出てきてないぞ。
……もう一度問題文を見たら、'div'って書いてある。ここが間違いだったらしい。正しくはバッククォートを用いて`div`とやる(上では最初から`div`と書いてしまっていた)。

プログラミングHaskellを買った

17:13 | プログラミングHaskellを買った - 猫とC#について書く代わりにHaskellについて書くmatarilloの日記 のブックマークコメント

プログラミングHaskell

プログラミングHaskell

これから勉強していく。

まずは第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したことになりそうだな。証明は……面倒くさい。