関数プログラミングの話題はこちら。
要望があったのでノートup
出かける前で時間が無くて大雑把+確認してないので不備があったら連絡よろしく_koi
4章5章あたりで足りないところ埋めようかと思ってたんですが、
微妙に間違っててあげるの夜になっちゃうかも…2010/06/06-15:05_koi
ちょっとずつ更新開始。絶対8章まで終わらない笑
一応動かしてはいるからHaskell的には合ってる。
ただ、動作が完璧にあっているかどうかはテストしてない。2010/06/06-22:30_koi
Ex.4-1
これはお絵かきです。
1の「maxThreeの定義上でモデル化され」が分からないんですが。
2はmax (max (max a b) c) dってところでしょうか。
3はmaxThree (max a b) c dってところでしょうか。
相対的な利点は…割愛で
Ex.4-2
bがaとcの間にあるならTRUEを返す関数。しかし、2 2 3などの場合もTRUEでいいのかは謎。下のプログラムはTRUEを返すようになっている。もし、返したくない場合は条件式の<=を<にする。
between :: Int -> Int -> Int -> Bool
between a b c
| a<=b && b<=c = True
| c<=b && b<=a = True
| otherwise = False
もうひとつのほうは、昇順のみ許しているから、一行除いてこんな感じになるのかな。
weakAscendingOrder :: Int -> Int -> Int -> Bool
weakAscendingOrder a b c
| a<=b && b<=c = True
| otherwise = False
Ex.4-3
解答サイト一番下に乗っているのは、下のプログラムの条件部分が他の関数になっているだけです。
howME :: Int -> Int -> Int -> Int
howME a b c
| a==b && b==c = 3
| a/=b && b/=c && c/=a = 0
| otherwise = 2
Ex.4-4
解答サイト一番下に乗っているものと同じやりかた。です。
Ex.4-13
ユークリッドの互除法を用いる。
mod m n は m%n の意味です。
解答サイトでは2つの関数を使用していた(確か)のですが、これでも動きました。
f413 :: Int -> Int -> Int
f413 m n
| mod m n ==0 = n
| mod m n /=0 = f413 n (mod m n)
8章
Ex.8-1
実行結果はこんな感じになりました。
||の場合は、前の4>2が自明で真なので後ろ側の評価がされていないのだと考えられる
&&の場合は後ろの式の評価が必要となり、fact(-1)を実行して乙。
ということだと思います。
Ex.8-2
これに関しても8-1同様である。
mult 0 (fact(-2))を実行したときに、最初の要素の0を見て、計算をやめて0を出力する形ならば、
mult (fact(-2)) 0の場合は最初にfact(-2)を計算しに行くから、乙。
ということだと思います。
8-1や8-2に関しては、自筆ノートには
遅延評価だから計算はせずにシカトする!と記してありますので間違いはないと思います。
最終更新:2010年07月31日 14:05