我知道monads是什么以及如何使用它们。 我不明白的是,让我们说, Option一个monad? 在Haskell中,一个monad Maybe是一个monad,因为它是从Monad类实例化的(至less有两个必要的函数return并bind ,使得Monad类实际上是一个monad)。 但在斯卡拉我们有这样的: sealed abstract class Option[+A] extends Product with Serializable { … } trait Product extends Any with Equals { … } 没有关系到monad。 如果我在Scala中创build自己的类,默认情况下会是monad吗? 为什么不?
为什么Clojure尽pipe如此强调function范例,却不使用Maybe / Option monad来表示可选值? Scala是一个我经常使用的函数式编程语言,它的使用相当普遍。
两者都是术语的types是所有types的交集(无人居住)。 两者都可以在代码中传递,而不会失败,直到试图评估它们。 我可以看到的唯一区别是,在Java中,有一个漏洞,允许null被评估为一个操作,这是参考相等比较( == ) – 而在哈斯克尔undefined根本不能被评估没有投掷一个例外。 这是唯一的区别吗? 编辑 我真正想要解决这个问题的是,为什么在Java中包含null这样一个显然很差的决定,Haskell如何逃避它呢? 在我看来,真正的问题是你可以用null做一些有用的事情,即你可以检查它是否为null 。 因为您可以这样做,所以在代码中传递null值并使它们指示“无结果”而不是“此程序中存在逻辑错误”已成为标准惯例。 而在Haskell中,没有办法检查一个术语是否评估到底而没有对它进行评估,程序是否爆炸,所以它永远不能用来表示“没有结果”。 相反,我们不得不使用像Maybe这样的东西。 对不起,如果看起来我玩的是“评估”这个词,那么我就玩得很快,而且我也试图在这里作一个比喻,并且无法精确地expression出来。 我想这是一个类比不精确的迹象。
我有一个algorithm返回->Maybe ([(Int,Int)],(Int,Int)) 我想从另一个方法调用此方法,并对数据执行操作。 但是,返回值包含关键字Just因为它可能是。 第二种方法需要([(Int,Int)],(Int,Int)) ,因此不会除Just ([(Int,Int)],(Int,Int)) 。 有没有一种方法可以在应用第二种方法之前修剪? 我不完全理解在Just的使用 – 但是,我被告知第一个Method的返回types必须是Maybe 。