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