我想了解更多有关haskell的->
运算符的信息。我不是很清楚它在特殊语法和某种类型类之间的界限是多么模糊,而且我想做一些探讨。具体来说,我见过这样的事情:
instance Monad ((->) r) where ...
这激起了我的兴趣。
然而,当我尝试搜索“haskell arrow”或“haskell function”或“haskell class function”时,我遇到了明显的问题,即获取Control.Arrow
或简单类型类教程的结果。
什么是->
,我在哪里可以阅读更多信息?
答案 0 :(得分:36)
(->)
通常被称为“函数箭头”或“函数类型构造函数”,虽然它确实有一些特殊的语法,但 并不是很特别。
它本质上是一个中缀类型的运算符。给它两种类型,它给你这些类型之间的函数类型。就像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 abstractions \x -> ...
,case expressions case ... of x -> ...
等。反向符号{ {1}}也出现在几个不相关的上下文中。不要将这些与功能箭头混淆。
答案 1 :(得分:0)
我认为是称为箭头。根据“Real World Haskell”:
- &GT;只有一个含义:它表示一个函数,它接受左侧类型的参数并返回右侧类型的值。