2016-08-26 62 views
3

我試圖按照foldr的術語定義原始遞歸,如A tutorial on the universality and expressiveness on fold第4.1章所述。模式匹配與解構的嚴格性

這裏是它

simpleRecursive f v xs = fst $ foldr g (v,[]) xs 
    where 
    g x (acc, xs) = (f x xs acc,x:xs) 

然而,以上定義不停止對head $ simpleRecursive (\x xs acc -> x:xs) [] [1..]

第一次嘗試下面是暫停

simpleRecursive f v xs = fst $ foldr g (v,[]) xs 
    where 
    g x r = let (acc,xs) = r 
      in (f x xs acc,x:xs) 

鑑於幾乎相同的定義,但不同的結果定義,爲什麼它有所不同?這與Haskell模式如何匹配有關嗎?

+1

可能與一個範圍問題與'xs',因爲它移動到的'g'解決問題的定義。 – chepner

回答

3

兩個功能之間的重要區別在於,在

g x r = let (acc, xs) = r 
     in (f x xs acc, x:xs) 

在元組構造函數的模式匹配是無可辯駁的,而在

g x (acc, xs) = (f x xs acc, x:xs) 

事實並非如此。換句話說,中g第一定義等同於

g x ~(acc, xs) = (f x xs acc, x:xs) 
+0

你的意思是說問題是有一些r不符合(acc,xs)? –

+0

不是(v,[])確定r始終是(acc,xs)的形式嗎? –

+0

不,因爲對函數的後續遞歸調用不會傳遞'(v,[])',而是由'g'返回。 – Cactus