我可能会问一些非常愚蠢的问题,并且答案可能很简单,例如“实施者以这种方式选择了它”,但是我来了。
要添加两个数字,我们可以使用任何样式:(10+) 4
或10 + 4
或(10 + 4)
。
如果我们有两个功能,说add10
和multiply5
并组合成一个函数,例如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
,您将观察到它也会失败。