lambda表达式的模式匹配

oad*_*ams 12 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)
Run Code Online (Sandbox Code Playgroud)

我想要这个函数创建的函数在不同的输入上采取不同的行为,这样它就可以创建一个递归函数.正如预期的那样,上面的代码不起作用.我如何做模式匹配,但它创建的功能?

谢谢

sep*_*p2k 21

pr f g = \xs y' -> case y' of 0     -> f xs
                              (y+1) -> g xs y ((pr f g) xs y)
Run Code Online (Sandbox Code Playgroud)

或者干脆

pr f g xs 0 = f xs
pr f g xs (y+1) = g xs y ((pr f g) xs y)
Run Code Online (Sandbox Code Playgroud)

(请记住,这f a b = ...基本上f a = \b -> ...是一个快捷方式,它是一种快捷方式f = \a -> \b -> ....)

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

具体来说,根据你的类型,函数接受一个[Int] -> Int(f),然后是一个接受另一个[Int] -> Int(g)的函数,然后是一个接受[Int](xs)然后返回一个Int 的函数.但是你用三个参数调用g并且你返回的最后一个函数有两个参数,所以你可能想要类似的东西([Int] -> Int) -> ([Int] -> Int -> Int -> Int) -> [Int] -> Int -> Int.