是否有带签名的内置功能:: (Monad m) => m a -> a?
Hoogle告诉我们没有这样的功能.
你能解释一下原因吗?
我已经看到提到IO不满足monad定律,但我没有找到一个简单的例子来证明这一点.有人知道一个例子吗?谢谢.
编辑:正如ertes和nm指出的那样,使用seq有点非法,因为它可以使任何monad失败的法律(结合undefined).由于undefined可以将其视为非终止计算,因此使用它完全没问题.
所以修改后的问题是:任何人都知道一个例子表明IO未能满足monad法则,而不使用seq?(或者,IO如果seq不允许,可能会出现符合法律规定的证据?)
有人可以提供一个超级简单(几行)monad变换器示例,这是非平凡的(即不使用Identity monad - 我理解).
例如,有人会如何创建一个执行IO并可以处理失败的monad(可能)?
什么是最简单的例子来证明这一点?
我已经浏览了一些monad变换器教程,他们似乎都使用State Monad或Parsers或者复杂的东西(对于newbee).我想看到一些比这简单的东西.我认为IO +也许会很简单,但我自己并不知道如何做到这一点.
我怎么能使用IO + Maybe monad堆栈?最重要的是什么?什么会在底部?为什么?
在什么样的用例中,人们想要使用IO + Maybe monad还是Maybe + IO monad?创造这样一个复合单子会有意义吗?如果是,何时以及为什么?
在看到如何定义List和Maybe monad之后,我自然会对IO monad 的操作>>=和return定义感到好奇.
我正在开发一个项目,除其他外,涉及数据库访问层.非常正常,真的.在之前的项目中,合作者鼓励我将Free Monads概念用于数据库层,所以我做到了.现在,我正在尝试在我的新项目中决定我获得了什么.
在之前的项目中,我有一个看似相似的API.
saveDocument :: RawDocument -> DBAction ()
getDocuments :: DocumentFilter -> DBAction [RawDocument]
getDocumentStats :: DBAction [(DocId, DocumentStats)]
Run Code Online (Sandbox Code Playgroud)
大约二十个这样的公共职能.为了支持它们,我有了DBAction数据结构:
data DBAction a =
SaveDocument RawDocument (DBAction a)
| GetDocuments DocumentFilter ([RawDocument] -> DBAction a)
| GetDocumentStats ([(DocId, DocumentStats)] -> DBAction a)
| Return a
Run Code Online (Sandbox Code Playgroud)
然后是monad实现:
instance Monad DBAction where
return = Return
SaveDocument doc k >>= f = SaveDocument doc (k >>= f)
GetDocuments df k >>= f = GetDocuments df (k >=> f)
Run Code Online (Sandbox Code Playgroud)
然后是口译员.然后是实现每个不同查询的原始函数.基本上,我觉得我有大量的胶水代码.
在我当前的项目中(在一个完全不同的领域),我已经为我的数据库添加了一个非常普通的monad: …
编译器或库中更"本机"的部分(IO或能够访问黑魔法和实现的函数)是否对这些定律做出假设?打破它们会导致不可能发生的事吗?
或者他们只是表达一种编程模式 - 也就是说,你唯一能够惹恼他们的人就是那些使用你的代码并且不希望你如此粗心的人?
我开始了我的Grand Haskell Crusade(GHC :)),我对monads和IO功能有点困惑.谁能解释一下这两个功能之间的区别是什么?
f1 = do x <- [1,2]
[x, x+1] -- this is monad, right?
f2 = do x <- [1,2]
return [x, x+1]
Run Code Online (Sandbox Code Playgroud)
结果是:
*Main> f1
[1,2,2,3]
*Main> f2
[[1,2],[2,3]]
Run Code Online (Sandbox Code Playgroud) 在不同的问题上,我发现了关于使用(->)Monads实例的评论中的提示,例如用于实现无点样式.
至于我,这有点过于抽象.好吧,我已经看到了Arrow实例,在(->)我看来,它(->)可以在实例表示法中使用,但不能在类型声明中使用(这可能只是另一个问题的东西).
有没有任何例子使用(->)Monad的例子?还是一个很好的链接?
很抱歉,如果这个问题可能已经在这里讨论过,但是搜索" (->)Monad实例"会给你很多次点击,因为你可以想象......因为几乎所有关于Haskell的问题都涉及到(->)"Monad".
我知道monad是什么以及如何使用它们.我不明白的是,是什么让Option一个单子?
在Haskell中,monad Maybe是一个monad,因为它是从Monad类中实例化的(它具有至少2个必要的函数return,bind并且实现了类Monad,实际上是monad).
但是在Scala我们有这个:
sealed abstract class Option[+A] extends Product with Serializable { ... }
trait Product extends Any with Equals { ... }
Run Code Online (Sandbox Code Playgroud)
没有任何与monad相关的东西.
如果我在Scala中创建自己的类,默认情况下它是monad吗?为什么不?