2010-05-10 24 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) 

Chcę, aby funkcja ta funkcja tworzyła inaczej na różnych wejściach, aby mógł utworzyć funkcję rekursywną. Zgodnie z oczekiwaniami powyższy kod nie działa. Jak zrobić coś takiego jak dopasowywanie wzorca, ale dla funkcji, którą tworzy?Dopasowywanie wzorców dla wyrażeń lambda

Dzięki

Odpowiedz

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

lub po prostu

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

(należy pamiętać, że f a b = ... jest po prostu skrót dla f a = \b -> ... która jest skrótem dla f = \a -> \b -> ....)

Zauważ, że n + 1 wzory jest przestarzałe i że typ określony dla pr nie pasuje do twojej (i mojej) definicji.

szczególności zgodnie z typem funkcji zajmuje [Int] -> Int (F), a następnie funkcji, która bierze udział [Int] -> Int (g), a następnie funkcji, która bierze [Int] (nadmiar), a następnie zwrócenie Int. Jednak wywołujesz g z trzema argumentami, a ostatnia zwracana funkcja przyjmuje dwa argumenty, więc prawdopodobnie potrzebujesz czegoś takiego jak ([Int] -> Int) -> ([Int] -> Int -> Int -> Int) -> [Int] -> Int -> Int.

Powiązane problemy