如何创建一个采用参数列表并返回将参数应用于另一个函数的函数的函数

时间:2019-08-23 14:03:29

标签: haskell recursion functional-programming function-composition

这听起来像是一个奇怪的问题,但请忍受。 我想创建一个接受参数列表的函数,并返回一个将这些参数应用于另一个函数的函数。我可以使用元组或模式匹配将其与一定长度的参数一起使用,如下所示:

applyAll (x, y, z) = ($ z) . ($ y) . ($ x)

applyAll [x, y, z] = ($ z) . ($ y) . ($ x)

既可以编译又可以按预期运行。

我注意到那些看起来很递归,并且想要制作一个可以接受任何长度参数的版本。这些是我的尝试:

applyAll []     = id
applyAll (x:xs) = applyAll xs . ($ x)

applyAll []     = id
applyAll (x:xs) = ($ x) . applyAll xs

但是,这不起作用。我收到此错误:

num.hs:121:5: error:
    * Occurs check: cannot construct the infinite type: b1 ~ a2 -> b1
      Expected type: [a2] -> b1 -> c
        Actual type: [a2] -> (a2 -> b1) -> c

我不太理解这个错误,但是由于原始功能有效,并且不是递归的,所以我认为这与递归有关。

也许与函数的操作顺序有关? 这就是我想像的函数在使用三个变量执行时的外观:

applyAll [x, y, z] = ($ x) . (($ y) . (($ z) . (id)))

有人有解决这个问题的想法吗?

0 个答案:

没有答案