我正在尝试在 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
它Z
,然后它就会是x*y
”这实际上使它成为身份功能,y
我没有知道为什么。