这听起来像是一个奇怪的问题,但请忍受。 我想创建一个接受参数列表的函数,并返回一个将这些参数应用于另一个函数的函数。我可以使用元组或模式匹配将其与一定长度的参数一起使用,如下所示:
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)))
有人有解决这个问题的想法吗?