组成一个2参数函数链

Ste*_*ehl 8 haskell function-composition

所以我有一个类型的两个参数的函数列表 [a -> a -> a]

我想编写一个函数,它将获取列表并将它们组成一个函数链,这些函数在左侧组成长度为+ 1的参数.例如,如果我有[f,g,h]所有类型,[a -> a -> a]我需要编写一个函数,它给出:

chain [f,g,h] = \a b c d -> f ( g ( h a b ) c ) d
Run Code Online (Sandbox Code Playgroud)

如果它有帮助,那么这些函数在它们的参数中是可交换的(即f x y = f y x对所有人而言x y).

我可以在列表理解中做到这一点,因为我知道有问题的函数的数量,它几乎就像定义一样.这是从固定数量的函数到动态数字的延伸,让我难以理解.

这是我到目前为止:

f xs = f' xs
    where
        f' []   = id
        f' (x:xs) = \z -> x (f' xs) z
Run Code Online (Sandbox Code Playgroud)

我认为逻辑是沿着正确的道路,它只是不进行类型检查.

提前致谢!

C. *_*ann 8

来自nm的注释是正确的 - 这不能以任何传统方式完成,因为结果的类型取决于输入列表的长度.你需要一个更加漂亮的类型系统来实现这一目标.您可以通过使用在类型中对其长度进行编码的列表来在Haskell中妥协,但这是痛苦和尴尬的.

相反,由于您的参数都是相同类型,因此创建一个采用值列表而不是多个参数的函数可以更好地服务.所以你想要的类型是这样的:chain :: [a -> a -> a] -> [a] -> a

有几种方法可以编写这样的函数.从概念上讲,您希望从参数列表的前面和函数列表的结尾开始,然后将第一个函数应用于第一个参数以获取类型的内容a -> a.从那里,将该函数应用于下一个参数,然后将下一个函数应用于结果,从每个列表中删除一个元素并为您提供一个新的类型函数a -> a.

您还需要处理列表长度不正确匹配的情况.除了前面提到的类型编码长度和与之相关的麻烦之外,没有办法解决这个问题.