(->)
通常被称为“功能箭头”或“功能型构造”,虽然它确实有一些特殊的语法,有没有是它太多特别之处。
它本质上是一个中缀型操作符。给它两种类型,它给你这些类型之间的函数类型。就像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 ... of x -> ...
等相反的符号<-
也出现在几个不相关的上下文中。不要将这些与功能箭头混淆。
注意:这应该是'实例Monad(( - >)r)'。 '( - >)'接受两个类型参数,而'Monad'只接受一个类型,所以你需要首先部分应用它。 – hammar 2012-02-03 22:36:25