coffeescript的“?。”操作符是monad吗?

时间:2014-05-26 22:24:34

标签: haskell coffeescript monads

我刚刚读到了Haskell中的Maybe Monad,它似乎在Coffeescript的?.运算符中扮演了类似的角色。 ?.运算符是否被认为是monad,还是只是两种不同的方式来做同样的事情?

在Haskell中,你写了

a >>= b >>= c

在coffeescript中,你写了

a?.b?.c

3 个答案:

答案 0 :(得分:9)

单个操作员不能像发动机不能作为机动车一样成为单子。短路行为是Maybe的一个属性,(Maybe, return, (>>=))恰好是monad。

可能存在一些你可以在CoffeeScript中定义的东西,它们一起成为monad,而?.填充“bind”角色。与Haskell不同,这些东西不太可能都是一流的,甚至不能代表语言。

答案 1 :(得分:2)

它与Maybe的定义(>> =)类似,但它不是monad。它只是一个短路函数应用程序,而不是具有操作returnbind(或returnfmapjoin)并且相关联的代数结构法律。

那没关系。它不需要成为monad。短路应用足以使其有用。

答案 2 :(得分:2)

  

?.运算符是否被认为是monad,还是两种不同的方式做同样的事情?

或许能够为CoffeeScript的?.运算符填写类似角色的能力并非来自于Maybe is a monad 。它来自于Maybe:数据类型的结构,以及它提供的有用操作。

这基本上都适用于所有单子;所有各个单独的monad所能做的所有惊人的事情都是因为他们的个人属性,而不是他们的monad-hood。 IO monad为您提供了一个神奇的模型,用于集成不能在Haskell中直接表达的不纯操作;不是因为它是一个单子,而是因为IO本身就是神奇的。列表monad允许您对可以采用多个可能值之一的非确定性值进行建模;不是因为它是monad,而是因为列表结构可以存储多个值。

表格的问题"是来自语言L的特征X(没有monad)monad?"有点遗漏这一点。某事物的事实"是一个单子"并没有孤立地得到任何东西。它允许你应用关于特征X的monadic使用的某些数学证明,你几乎肯定不会这样做。什么"成为monad"这是一种很好的方式,可以看到很多不同的结构都是#34;同样的东西",并提供了一个通用的接口,允许你编写(并重用现有的)代码,这些代码适用于任何 monad。

一个简单的例子是sequence函数;对于任何monad m,它会将monadic值列表[m a]添加到monadic值列表m [a]中。与Maybe monad一起使用时,它会从可能值为[Maybe a]Maybe [a]的列表中为您提供函数 - 如果任何内部元素为Nothing,则结果为Nothing ,否则你得到所有元素的列表。只需一个?.运算符,你就必须编写一些(简单)代码才能做到这一点,但如果你想要你可以定义一个函数,现在你就像使用monad一样简单,对吧?但是sequence 也可以获取列表列表,并为您提供列表列表,其中包含从每个原始列表中选择一个元素的每个组合。或者它可以获取IO操作列表,并为您提供单个IO操作,该操作执行每个原始操作并在单个列表中生成结果。或者等等。

没有人必须提前考虑任何这些功能。它们非常简单,可以直接以非monadic风格实现,但是你通常不得不每次都需要其他语言,因为大多数语言都不是由大多数语言的标准库提供的。在哈斯克尔,他们都已经免费获得,因为有人想到sequence :: Monad m => [m a] -> m [a]。已经为您实现了sequence所做的版本,即使对于编写标准库时不存在的新monad 也是如此。而这只是一个功能!

那是什么"是一个monad"在一个编程环境中,monad被广泛使用。即使您发现额外的结构允许?.成为CoffeeScript中monad定义的一部分(并采用必要的约定来确保CoffeeScript的命令性质不会使monadic操作的规则无效应该坚持,你只是赢得了这个好处。如果你接近monad的概念,那么你甚至不会看到 的好处,monad会给我带来什么?替换?.给我的东西?"