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.