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

So8*_*res 31 haskell

我想了解更多有关haskell ->运营商的信息.我不是很清楚它在特殊语法和某种类型类之间的界限是多么模糊,而且我想做一些探讨.具体来说,我见过这样的事情:

instance Monad ((->) r) where ...
Run Code Online (Sandbox Code Playgroud)

这激起了我的兴趣.

但是,当我尝试搜索"haskell arrow"或"haskell function"或"haskell类函数"时,我遇到了明显的问题,即获得结果Control.Arrow或简单的类型类教程.

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

ham*_*mar 39

(->)通常被称为"功能箭头"或"功能型构造",虽然它也有一些特殊的语法,有没有太多特别的地方.

它本质上是一个中缀类型的运算符.给它两种类型,它给你这些类型之间的函数类型.就像2 + 3是语法糖(+) 2 3,因此是from -> to句法糖(->) from to.Function from to如果符号混乱,你可以想到它.

换句话说,您提到的实例可以理解为

instance Monad (Function from) where ...
Run Code Online (Sandbox Code Playgroud)

这清楚地说明了我们所讨论的函数接受了一些任意(但固定)类型的参数.事实上,这个monad实例可以在Control.Monad.Instances中找到,它与Reader monad基本相同.

看一下这个来源,它真的很简单:

instance Monad ((->) r) where
  return = const
  f >>= k = \ r -> k (f r) r
Run Code Online (Sandbox Code Playgroud)

return忽略参数给出的微不足道的值,(>>=)运算符将参数分配r给双方.

值得注意的是,在Applicative函数的相应实例中,pure并且(<*>)对应于SKI组合子演算的K和S组合子.

(->)也是由Arrow类引入的.这里可以找到箭头介绍.

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

  • 一如既往的好答案。但是,有人可能会说,lambda表达式中的-&gt;与类型运算符的关系比人们想象的要多。而且,当然((\ a-&gt; b)c`是a-&gt; b`的情况c,反之亦然。 (2认同)