2016-08-26 2 views
3

Ich versuche primitive Rekursion in Begriff foldr zu definieren, wie in A tutorial on the universality and expressiveness on fold Kapitel 4.1 erläutert.Strenge des Mustervergleichs vs. Dekonstruieren

ist hier erste Versuch es

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

jedoch obige Definition halt nicht für head $ simpleRecursive (\x xs acc -> x:xs) [] [1..]

Below Definition ist die

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

Bei fast ähnliche Definition aber anderes Ergebnis zu stoppen, Warum unterscheidet es sich? Hat es damit zu tun, wie Haskell Muster übereinstimmen?

+1

Wahrscheinlich zu einem Scoping-Problem im Zusammenhang mit 'xs', da es auf die Definition von' bewegen g' das Problem behebt. – chepner

Antwort

3

Der entscheidende Unterschied zwischen den beiden Funktionen, die auf dem Tupel Konstruktor in

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

Die Musterübereinstimmung unwiderlegbarer ist, wohingegen in

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

es nicht ist. Mit anderen Worten ist die erste Definition g entsprechen

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

Meinst du, dass das Problem ist, gibt es einige r, die nicht übereinstimmt (acc, xs)? –

+0

stellt nicht die (v, []) sicher, dass r immer in Form von (acc, xs) ist? –

+0

Nein, weil nachfolgende rekursive Aufrufe an die Funktion nicht übergeben werden (v, []) ', sondern was auch immer von' g' zurückgegeben wird. – Cactus