haskell - 在哪里可以阅读 haskell "->"运算符?

标签 haskell

我想了解有关 haskell 的 -> 运算符的更多信息。我不太清楚它在多大程度上模糊了特殊语法和某种类型类之间的界限,我想做一些研究。具体来说,我见过这样的事情:

instance Monad ((->) r) where ...

这引起了我的兴趣。

但是,当我尝试搜索“haskell arrow”或“haskell function”或“haskell class function”时,我遇到了获取 Control.Arrow 或简单类型结果的明显问题类(class)辅导。

-> 叫什么?在哪里可以阅读更多相关信息?

最佳答案

(->)通常被称为“函数箭头”或“函数类型构造函数”,虽然它确实有一些特殊的语法,但并没有那么特别。

它本质上是一个中缀类型运算符。给它两种类型,它就会为您提供这些类型之间的函数类型。就像 2 + 3(+) 2 3 的语法糖,from -> to 也是如此(->) from to 的语法糖。你可以把它想象成 Function from to如果符号令人困惑。

也就是说,你提到的实例可以理解为

instance Monad (Function from) where ...

这清楚地表明我们正在讨论采用某种任意(但固定)类型的参数的函数。事实上,这个 monad 实例可以在 Control.Monad.Instances 中找到。它本质上与 the Reader monad 相同.

查看 the source ,这真的很简单:

instance Monad ((->) r) where
  return = const
  f >>= k = \ r -> k (f r) r

return 给出的平凡值忽略该参数,并且 (>>=)运算符分配参数 r向两侧。

还值得注意的是,在相应的 Applicative 中函数实例,pure(<*>)对应于 the SKI combinator calculus 的 K 和 S 组合子。

(->)也可以概括为 Arrow type class 。箭头简介can be found here .

最后,请注意符号 ->也出现在语法的其他或多或少不相关的部分中,包括 lambda 抽象 \x -> ... , case 表达式 case ... of x -> ...等反向符号<-也发生在几个不相关的上下文中。不要将它们与功能箭头混淆。

关于haskell - 在哪里可以阅读 haskell "->"运算符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9136421/

相关文章:

Haskell 类型提升

haskell - 如何在特定情况下使用高阶结构

haskell - 为什么在创建类型类实例时不能下划线(忽略)类型变量?

haskell - 如何实现一个最优的、纯功能性的、双端优先级队列?

haskell - 函数组合问题

Haskell - FFI 和指针

haskell - 为什么要为像 'nameless' 这样的 `(->) e` 类型定义一个仿函数实例

haskell - 堆栈找不到它应该可以找到的本地模块

Haskell IO - hGetContents : illegal operation (handle is closed)

java - 将一段 Java 代码翻译为 Haskell