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

Bu fonksiyonun farklı girişler üzerinde farklı davranmaları için işlev oluşturmasını istiyorum, böylece tekrarlayan bir işlev oluşturabilir. Beklendiği gibi, yukarıdaki kod çalışmıyor. Desen eşleştirmesi gibi bir şeyi nasıl yaparım, ancak oluşturduğu işlev için?Lambda ifadeleri için desen eşleştirmesi

Teşekkür

cevap

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

veya basitçe

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

( f a b = ... f = \a -> \b -> ... için bir kısayol f a = \b -> ... için bir kısayol temelde olduğunu unutmayın.)

Not n + 1 desenler olduklarını kullanımdan kaldırılmış ve pr için belirttiğiniz tür (ve benim) tanımınızla uyuşmuyor.

Özellikle türüne göre işlevsel bir [Int] -> Int (f) başka bir [Int] -> Int (g) alır, daha sonra, bir fonksiyon, bir [Int] (xs) alır sonra fonksiyonu ve daha sonra bir Int geri alır. Bununla birlikte, üç argümanla g çağırırsınız ve döndürdüğünüz son işlev iki argüman alır, bu yüzden muhtemelen ([Int] -> Int) -> ([Int] -> Int -> Int -> Int) -> [Int] -> Int -> Int gibi bir şey istersiniz.

İlgili konular