ログ日記

作業ログと日記とメモ

遅延評価とか

同じ引数で実行された関数は同じ結果を返す。
この「同じ引数」ってどういうことだろう。

f1 a b = a + b

ここで

f2 = f1 2 3
f3 = f4 2 3
  where f4 a b = f1 a b

とした場合、f3はf4からf1を呼んでおり、a と b の実態が何であるかは + 演算をしたときに初めて分かる?
そう考えるとこの書き方の場合メリットが無い・・?


ゲーム木の探索で、同じ状態を引数に評価関数を呼び出したらすぐに結果を返してほしいんだけど、同じ状態かどうかを判断するためには状態一つ一つについて確かめないといけないのかな。


scat.rb:ERROR
ぱっと見で理解できない・・。もっと簡単な例はないかな・・。


# 簡単な実験をしてみた

import System.IO.Unsafe

main = do
  putStr $ f1 "a" "b" ++ " f1-1\n"
  putStr $ f1 "a" "b" ++ " f1-2\n"
  let a = "a"
      b = "b"
  putStr $ f1 a b ++ " f1-3\n"
  putStr $ f1 a b ++ " f1-4\n"
  putStr $ f2 ++ " f2-1\n"
  putStr $ f2 ++ " f2-2\n"
  putStr $ f3 ++ " f3-1\n"
  putStr $ f3 ++ " f3-2\n"

f1 :: String -> String -> String
f1 a b = unsafePerformIO ((putStr $ "a ++ b = " ++ a ++ b ++ "\n") >> return "return")
f2 = f1 "a" "b"
f3 = f4 "a" "b"
    where f4 a b = f1 a b


結果

a ++ b = ab
return f1-1
a ++ b = ab
return f1-2
a ++ b = ab
return f1-3
a ++ b = ab
return f1-4
a ++ b = ab
return f2-1
return f2-2
a ++ b = ab
return f3-1
return f3-2

確かに二回目に呼んだf2やf3は関数内のputStrが実行されていない。
が、f1-4は関数の中まで実行されている。
どうなってるんだろう。難しい・・。
IOの中で呼んだのがまずかったかな。もう少しやってみよう。