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

Quiero la función que esta función crea para actuar de forma diferente en diferentes entradas, de modo que pueda crear una función recursiva. Como se esperaba, el código anterior no funciona. ¿Cómo hago algo parecido a la coincidencia de patrones, pero para la función que crea?Coincidencia de patrón para expresiones lambda

Gracias

Respuesta

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

o simplemente

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

(recordar que f a b = ... es básicamente un atajo para f a = \b -> ... que es un acceso directo para f = \a -> \b -> ....)

Tenga en cuenta que n + 1 patrones son obsoleto y que el tipo que especificó para pr no coincide con su definición (y la mía).

Específicamente de acuerdo con su tipo de la función toma un [Int] -> Int (f), a continuación, una función que toma otra [Int] -> Int (g), a continuación, una función que toma un [Int] (XS) y luego devolver un Int. Sin embargo, llama a g con tres argumentos y la última función que devuelve requiere dos argumentos, por lo que presumiblemente desea algo como ([Int] -> Int) -> ([Int] -> Int -> Int -> Int) -> [Int] -> Int -> Int.