阅读http://www.seas.upenn.edu/~cis194/spring13/lectures/04-higher-order.html它说明
特别要注意的是,函数箭头与右边相关联,即W - > X - > Y - > Z等于W - >(X - >(Y - > Z)).我们总是可以在类型中最右边的顶级箭头周围添加或删除括号.
函数箭头与右侧相关联,但是当函数应用程序与左侧相关联时,此信息的用处是什么?我觉得我不理解对我来说这是一个无意义的点,功能箭头与右边相关联.由于函数应用程序始终与左侧相关联,那么这是我应该关注的唯一关联点?
Tox*_*ris 14
功能箭头与右侧相关但[...]此信息的用处是什么?
例如,如果您看到类型签名,则f : String -> Int -> Bool
需要知道函数箭头的关联性,以了解其f
真正的类型:
(String -> Int) -> Bool
,即将f
函数作为参数并返回一个布尔值.String -> (Int -> Bool)
,即将f
字符串作为参数并返回一个函数.这是一个很大的区别,如果你想使用f
,你需要知道它是哪一个.由于函数箭头与右侧相关联,因此您知道它必须是第二个选项:f
接受一个字符串并返回一个函数.
与右侧[...]功能应用程序关联的功能箭头关联到左侧
这两个选择很好地协同工作.例如,我们可以f
从上面调用f "answer" 42
真正意味着的(f "answer") 42
.所以我们在传递字符串"answer"
到f
返回的功能.然后我们将数字传递42
给该函数,该函数返回一个布尔值.实际上,我们几乎使用f
两个参数作为函数.
这是在Haskell中使用两个(或多个)参数编写函数的标准方法,因此它是一个非常常见的用例.由于函数应用程序和函数箭头的关联性,我们可以编写这个没有括号的常见用例.
在定义一个双参数curried函数时,我们通常会写这样的东西:
f :: a -> b -> c
f x y = ...
Run Code Online (Sandbox Code Playgroud)
如果箭头没有与右边相关联,则上面的类型必须拼写为a -> (b -> c)
.因此,->
关联性的有用性在于它在声明函数类型时可以避免编写太多括号.