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)
我希望此函数创建的函数在不同的输入上采取不同的行为,以便它可以创建递归函数。正如预期的那样,上面的代码不起作用。我如何做模式匹配,但是它创建的功能呢?
由于
答案 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}}之类的东西。