我可能会问一些非常愚蠢的问题,并且答案可能很简单,例如“实施者以这种方式选择了它”,但是我来了。

要添加两个数字,我们可以使用任何样式:(10+) 410 + 4(10 + 4)

如果我们有两个功能,说add10multiply5并组合成一个函数,例如add10andMultiply5然后add10.mul5 10似乎在出现错误add10.mul5 $ 5将起作用,(add10.mul5) 5将起作用,add10andMultiply5 5也将起作用。

有何评论为什么第一个不起作用?
请赐教。谢谢。

最佳答案

Haskell中的功能组合的优先级低于功能应用程序。因此add10.mul5 10被解析为add10 . (mul5 10)。现在,.的类型为:

(.) :: (b -> c) -> (a -> b) -> a -> c

第一个参数(add10)的类型为Int -> Int,因此我们可以确定b为Int,因此.期望其第二个参数的类型为a -> Int。但是,它的类型为Int。添加$会更改关联,这意味着在将组合函数应用于10之前完成了函数组合。

在您的第一个示例中,所有内容都可以正常运行,因为您不是在编写函数,而是在应用它们。在这种情况下,等效项将是尝试执行(10+) . 4,您将观察到它也会失败。

10-02 12:22