【问题标题】:Where can I read up on the haskell "->" operator?我在哪里可以阅读 haskell "->" 运算符?
【发布时间】:2012-02-03 22:32:01
【问题描述】:

我想了解更多有关 haskell 的 -> 运算符的信息。我不太清楚它在多大程度上模糊了特殊语法和某种类型类之间的界限,我想做一些探索。具体来说,我见过这样的事情:

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

这引起了我的兴趣。

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

-> 叫什么,我在哪里可以了解更多信息?

【问题讨论】:

  • 注意:应该是instance Monad ((->) r)(->) 接受两个类型参数,而 Monad 用于只接受一个的类型,因此您需要先部分应用它。

标签: haskell


【解决方案1】:

(->) 通常被称为“函数箭头”或“函数类型构造函数”,虽然它确实有一些特殊的语法,但 并没有什么特别之处。

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

【讨论】:

  • 很好的答案,一如既往。然而,有人可能会争辩说,lambda 表达式中的 -> 与类型运算符的相关性比人们想象的要多。当然,(\a -> b) ccase c of a -> b,反之亦然。
【解决方案2】:

我认为它叫做箭头。根据“Real World Haskell”:

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

【讨论】:

  • 这是在类型签名中,但 OP 正在谈论一个函数
猜你喜欢
  • 2012-12-19
  • 1970-01-01
  • 2020-12-18
  • 2011-04-20
  • 2019-09-07
  • 2010-12-03
  • 1970-01-01
  • 2016-10-24
相关资源
最近更新 更多