2010-05-10 12 views
11
21 --Primitive recursion constructor 
22 pr :: ([Int] -> Int) -> ([Int] -> Int) -> ([Int] -> Int) 
23 pr f g = \xs 0 -> f xs 
24 pr f g = \xs (y+1) -> g xs y ((pr f g) xs y) 

Ich möchte die Funktion, die diese Funktion erstellt, auf verschiedene Eingaben anders zu handeln, so dass es eine rekursive Funktion erstellen kann. Wie erwartet, funktioniert der obige Code nicht. Wie mache ich so etwas wie Mustervergleich, aber für die Funktion, die es erstellt?Mustervergleich für Lambda-Ausdrücke

Dank

Antwort

20
pr f g = \xs y' -> case y' of 0  -> f xs 
           (y+1) -> g xs y ((pr f g) xs y) 

oder einfach

pr f g xs 0 = f xs 
pr f g xs (y+1) = g xs y ((pr f g) xs y) 

(Beachten Sie, dass f a b = ... für f a = \b -> ... grundsätzlich eine Abkürzung, die für f = \a -> \b -> ... eine Verknüpfung ist.)

anzumerken, dass n + 1 Muster ist veraltet und der Typ, den Sie für pr angegeben haben, stimmt nicht mit Ihrer (und meiner) Definition überein.

Insbesondere entsprechend Ihrer Art nimmt die Funktion einen [Int] -> Int (f), dann wird eine Funktion, die ein weiteres [Int] -> Int (g) hat, dann eine Funktion, die eine [Int] (xs) und dann zurückkehrt eine Int nimmt. Sie rufen jedoch g mit drei Argumenten auf, und die letzte Funktion, die Sie zurückgeben, benötigt zwei Argumente. Wahrscheinlich möchten Sie also etwas wie ([Int] -> Int) -> ([Int] -> Int -> Int -> Int) -> [Int] -> Int -> Int.