プログラミング Haskell 第12章 遅延評価 練習問題

12章は例があまりなかったので記述形式の練習問題が多いです。

  • 1.
    • 1 + (2*3) => 2*3 最内
    • (1+2)*(2+3) => 1+2 最内、2+3 どちらでもない
    • fst (1+2, 2+3) => fst (l1+2, 2+3) 最外、1+2 最内、2+3 どちらでもない
    • (λx -> 1 + x) (2*3) => (λx -> 1 + x) (2*3) 最外、2*3 最内
      • (1+x)は仮に + のかわりに正格でない関数だとしてもラムダ式の中なので簡約されないはず
  • 2. fst はタプルの最初の要素だけ取り出すので2つめの要素の評価を省略できる
  • 3. 以下の通り
-- 定義
mult = \x -> (\y -> x * y)

mult 3 4
(\x -> (\y -> x * y)) 3 4
(\y -> 3 * y) 4
3 * 4
12
  • 4.
fibs :: [Integer]

fibs = 0:1:map (add) (zip fibs (tail fibs))
       where add (x,y) = x+y
  • 5.
fib :: Int -> Integer
fib n = head (drop n fibs)

-- 1000 より大きな最初のフィボナッチ数
head (dropWhile (<= 1000) fibs)

もう一問残りました。