Haskellでいくつかの基本的な原始再帰関数を定義しようとしています。times
関数が何度も繰り返されるのはなぜですか(つまりeval times[x,y]
、結果として(x+1)*y
)?私の問題は、一般的に、合成関数がどのように機能するかについての理解が不十分なためだと思います。私の理解を明確にするために、説明なしで答えないでください。
import Prelude hiding (pred,and,or,not)
data PR = Z
| S
| P Int
| C PR [PR]
| PR PR PR
deriving Show
eval :: PR -> [Integer] - Integer
eval Z _ = 0
eval S [x] = x+1
eval (P n) xs = nth n xs
eval (C f gs) xs = eval f (map (\g -> eval g xs) gs)
eval (PR g h) (0:xs) = eval g xs
eval (PR g h) (x:xs) = eval h ((x-1) : eval (PR g h) ((x-1):xs) : xs)
nth _ [] = error "nth nil"
nth 0 _ = error "nth index"
nth 1 (x:_) = x
nth (n) (_:xs) = nth (n-1) xs
one = C S [Z]
plus = PR (P 1) (C S [P 2])
times = PR (P 1) (C plus [P 2, P 3])
私はtimes
最も近い存在のために他のいくつかのことを試みましたtimes = PR (P 1) (C plus[P 2, P 2]
が、これは2x*y
私が「まあ、それらP 2
の1つを置き換えるだけでZ
、それは次のようになる」と思っx*y
たのです。これは実際にそれを恒等関数にします。y
理由を考えてください。