2012-02-03 51 views
21

我想了解更多关于haskell的运营商->。我不是很清楚它是如何模糊特殊语法和某种类型类之间的界限,我想要做点什么。例如,我已经看到这样的事情:我在哪里可以阅读haskell“ - >”运算符?

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

这激起了我的兴趣。但是,当我尝试搜索“haskell箭头”或“haskell函数”或“haskell类函数”时,我遇到了获取Control.Arrow或简单类型类教程结果的明显问题。

什么是->打来电话,我在哪里可以阅读更多关于它?

+2

注意:这应该是'实例Monad(( - >)r)'。 '( - >)'接受两个类型参数,而'Monad'只接受一个类型,所以你需要首先部分应用它。 – hammar 2012-02-03 22:36:25

回答

27

(->)通常被称为“功能箭头”或“功能型构造”,虽然它确实有一些特殊的语法,有没有它太多特别之处。

它本质上是一个中缀型操作符。给它两种类型,它给你这些类型之间的函数类型。就像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 -> ...等相反的符号<-也出现在几个不相关的上下文中。不要将这些与功能箭头混淆。

+1

一如既往的很好的答案。然而,有人可能会争论说,lambda表达式中的 - >与类型运算符有更多的关联,而不是人们可能会想到的。当然'(\ a→b)c'是' - > b'的情况c,反之亦然。 – Ingo 2012-02-04 12:37:33

0

我认为这是称为的箭头。据“Real World Haskell”:

- >只有一个含义:它表示一个函数,它在左边的类型的参数,并返回右边的类型的值。

+1

这是在类型签名,但OP的谈论功能 – amindfv 2012-02-04 03:38:10

相关问题