"功能箭头与右边相关"的用处是什么?

blu*_*sky 6 haskell

阅读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真正的类型:

  1. 如果箭头与左侧相关联,那么类型意味着(String -> Int) -> Bool,即将f函数作为参数并返回一个布尔值.
  2. 如果箭头关联到右边,那么类型意味着String -> (Int -> Bool),即将f字符串作为参数并返回一个函数.

这是一个很大的区别,如果你想使用f,你需要知道它是哪一个.由于函数箭头与右侧相关联,因此您知道它必须是第二个选项:f接受一个字符串并返回一个函数.

与右侧[...]功能应用程序关联的功能箭头关联到左侧

这两个选择很好地协同工作.例如,我们可以f从上面调用f "answer" 42真正意味着的(f "answer") 42.所以我们在传递字符串"answer"f返回的功能.然后我们将数字传递42给该函数,该函数返回一个布尔值.实际上,我们几乎使用f两个参数作为函数.

这是在Haskell中使用两个(或多个)参数编写函数的标准方法,因此它是一个非常常见的用例.由于函数应用程序和函数箭头的关联性,我们可以编写这个没有括号的常见用例.

  • 这也有助于您思考[currying](https://en.wikipedia.org/wiki/Currying)的有用技巧,我们使用返回的实际_function_.例如,如果我们有一些计算`x*y`的`fxy:Int - > Int - > Int`,那么我们可以使用`f 2`作为"double"函数,`f 3`作为"三倍" "功能等 (2认同)

sep*_*p2k 5

在定义一个双参数curried函数时,我们通常会写这样的东西:

f :: a -> b -> c
f x y = ...
Run Code Online (Sandbox Code Playgroud)

如果箭头没有与右边相关联,则上面的类型必须拼写为a -> (b -> c).因此,->关联性的有用性在于它在声明函数类型时可以避免编写太多括号.