Tag: monads

究竟是什么让选项在斯卡拉monad?

我知道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吗? 为什么不?

我什么时候想要使用免费的Monad + Interpreter模式?

我正在开发一个项目,其中包括一个数据库访问层。 很正常,真的。 在之前的一个项目中,合作者鼓励我将Free Monad概念用于数据库层,所以我这样做了。 现在我试图在我的新项目中决定我所获得的。 在之前的项目中,我有一个相当像这样的API。 saveDocument :: RawDocument -> DBAction () getDocuments :: DocumentFilter -> DBAction [RawDocument] getDocumentStats :: DBAction [(DocId, DocumentStats)] 等约二十个这样的公共职能。 为了支持他们,我有了DBAction数据结构: data DBAction a = SaveDocument RawDocument (DBAction a) | GetDocuments DocumentFilter ([RawDocument] -> DBAction a) | GetDocumentStats ([(DocId, DocumentStats)] -> DBAction a) | Return a 然后是monad实现: instance Monad DBAction where […]

为什么在Clojure中使用Maybe / Option没有这么普遍?

为什么Clojure尽pipe如此强调function范例,却不使用Maybe / Option monad来表示可选值? Scala是一个我经常使用的函数式编程语言,它的使用相当普遍。

为什么Haskell中没有IO变换器?

每一个monad都有一个变压器版本,从我所知道的变压器的想法是单子的通用扩展。 跟随其他变压器的build立, IOT将是类似的东西 newtype IOT ma = IOT { runIOT :: m (IO a) } 为此,我可以在现场IOT Maybe有用的应用程序: IOT Maybe可以执行一个IO操作,也可以不执行任何操作, IOT []可以创build一个列表,稍后可以将其作为sequence d。 那么为什么Haskell中没有IO变压器呢? (注意:我在Haskell Cafe看过这篇文章 ,但是没有太多意义, ST转换器的Hackage页面在其描述中提到了一个可能相关的问题,但是没有提供任何细节。

用Monad变形金刚避免电梯

我有一个问题,非常适合使用堆栈的MT(甚至一个MT)通过IO。 一切都很好,只是在每个动作之前使用电梯是非常烦人的! 我怀疑这件事真的没有什么可做,但我想我会问。 我知道提升整个块,但如果代码真的是混合types呢? 如果GHC放入一些句法糖(例如<-$ = <- lift ),会不会很好?

scala Iterable#map与Iterable#flatMap

Iterable的map和flatMap函数有什么区别?

有没有一个monad没有相应的monad变压器(IO除外)?

到目前为止,我所遇到的每个monad(可以表示为一个数据types)都有一个对应的monad变换器,或者可以有一个。 有没有这样的monad? 还是所有的monad都有相应的变压器? 通过对应于monad m的变换器t ,我的意思是t Identity同构同构于m 。 当然,它符合monad变压器法则,而且对于任何monad n来说都是monad。 我希望看到一个certificate(理想上是有build设性的),即每一个单子都有一个certificate,或者是一个没有certificate的单子的certificate。 我对哈斯克尔导向的答案以及(类别)理论答案都感兴趣。 作为一个后续的问题,是否有一个monad m有两个不同的变换器t1和t2 ? 也就是说, t1 Identity同构于t2 Identity和m ,但是有一个monad n使得t1 n不同构于t2 n 。 ( IO和ST有一个特殊的语义,所以我不考虑它们,让我们完全忽略它们,让我们只关注可以使用数据types构造的“纯”单子。

暂停monad

Monads可以做许多惊人的,疯狂的事情。 他们可以创buildvariables来保存值的叠加。 在计算之前,它们可以让您访问未来的数据。 他们可以让你写破坏性的更新,但不是真的。 然后继续monad让你打破人心! 通常你自己的。 😉 但是,这是一个挑战:你能制造一个可以暂停的monad吗? 数据暂停sx 实例Monad(暂停) mutate ::(s – > s) – >暂停s() yield :: Pause s() step :: s – > Pause s() – >(s,Maybe(Pause s())) Pause monad是一种状态monad(因此mutate ,明显的语义)。 通常像这样的monad具有某种“运行”function,它运行计算并将您返回到最终状态。 但Pause是不同的:它提供了一个step函数,它运行计算,直到它调用魔术yield函数。 这里的计算暂停,返回给调用者足够的信息以稍后恢复计算。 对于额外的awesomne​​ss:允许调用者修改step之间的状态。 (例如上面的types签名应该允许这样做。) 用例:编写复杂的代码通常很容易,但总的PITA将其转换为在其操作中也输出中间状态。 如果你希望用户能够通过执行中途改变某些事情,事情变得非常复杂。 实施思路: 显然可以通过线程,锁和IO来完成。 但是我们可以做得更好吗? 😉 疯狂的继续单子吗? 也许某种作家monad, yield只是logging当前状态,然后我们可以通过遍历日志中的状态来“伪装”来step它。 (显然,这排除了改变步骤之间的状态,因为现在我们并不真正“暂停”任何东西。)

Monads与箭头

我对函数式编程中使用的monads和arrow的概念非常熟悉。 我也明白,他们可以用来解决类似的问题。 不过,在任何情况下如何select使用哪一个,我还是有点困惑。 我应该什么时候使用monads,什么时候应该使用箭头?

Haskell Cont monad如何以及为何工作?

这是Cont monad的定义: newtype Cont ra = Cont { runCont :: (a -> r) -> r } instance Monad (Cont r) where return a = Cont ($ a) m >>= k = Cont $ \c -> runCont m $ \a -> runCont (ka) c 你能解释一下为什么这个工作原理? 它在做什么?