我試圖在Haskell中定義一些basic Primitive Recursive函數。爲什麼我的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
的身份識別功能,我不知道爲什麼。
,在'EVAL是一個錯字(C ...)'。你能否進一步解釋他的作品爲什麼?我認爲'Z'應該在那裏,但爲什麼要取代'P 1'呢?另外,我並不完全理解'P 3'如何映射到輸入。時代正在通過兩個價值觀,第三個來自哪裏? – evanmcdonnal