関数プログラミングの話題はこちら。



要望があったのでノート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