我想了解有关 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/