lambda表达式的模式匹配

时间:2010-05-10 10:05:28

标签: haskell

 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)

我希望此函数创建的函数在不同的输入上采取不同的行为,以便它可以创建递归函数。正如预期的那样,上面的代码不起作用。我如何做模式匹配,但是它创建的功能呢?

由于

1 个答案:

答案 0 :(得分:21)

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

或只是

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 -> ...的快捷方式,f = \a -> \b -> ...[Int] -> Int的快捷方式。)

请注意,不推荐使用n + 1模式,并且为pr指定的类型与您的(和我的)定义不匹配。

具体根据你的类型,函数采用[Int] -> Int(f),然后采用另一个[Int](g)的函数,然后采用([Int] -> Int) -> ([Int] -> Int -> Int -> Int) -> [Int] -> Int -> Int(xs)的函数然后返回一个Int。但是你用三个参数调用g并且你返回的最后一个函数有两个参数,所以你可能想要{{1}}之类的东西。