我正在编写一个程序来解决原始递归函数的结果:
1 --Basic functions------------------------------
2
3 --Zero function
4 z :: Int -> Int
5 z = \_ -> 0
6
7 --Successor function
8 s :: Int -> Int
9 s = \x -> (x + 1)
10
11 --Identity/Projection function generator
12 idnm :: Int -> Int -> ([Int] -> Int)
13 idnm n m = \(x:xs) -> ((x:xs) !! (m-1))
14
15 --Constructors--------------------------------
16
17 --Composition constructor
18 cn :: ([Int] -> Int) -> [([Int] -> Int)] -> ([Int] -> Int)
19 cn f [] = \(x:xs) -> f
20 cn f (g:gs) = \(x:xs) -> (cn (f (g (x:xs))) gs)
这些函数和构造函数在此处定义:http://en.wikipedia.org/wiki/Primitive_recursive_function
问题在于我尝试创建compositon构造函数,cn。当它到达基本情况时,f不再是部分应用程序,而是函数的结果。然而,该函数期望函数作为第一个参数。我该如何处理这个问题?
感谢。
答案 0 :(得分:3)
给出f,
f :: [a] -> b
和g_k,
g_k :: [a] -> a
我们想要生成h,
h :: [a] -> b
所以组成应该像
compo :: ([a] -> b) -> [[a] -> a] -> [a] -> b
compo f gs xs = f (map ($ xs) gs)
示例:http://codepad.org/aGIKi8dF
编辑:它也可以用应用风格编写(消除$
)
compo f gs xs = f (gs <*> pure xs)