标签: monads

如何用List monad建模非确定性?

任何人都可以解释(更好的用简单英语的例子)列表monad可以做什么来模拟非确定性计算?即问题是什么以及列表monad可以提供什么解决方案.

monads f# haskell functional-programming non-deterministic

32
推荐指数
4
解决办法
3442
查看次数

为什么需要像"runSomeMonad $ do ..."这样的调用?

显然唯一可能的解释runSomeMonad do ...runSomeMonad (do ...).为什么不是Haskell语法允许的第一个变体?有些情况foo do bar可能实际上是模棱两可的吗?

syntax monads haskell do-notation

32
推荐指数
1
解决办法
1990
查看次数

Java 8是否缺少OptionalBoolean?

作为一种原始的版本Optional*,爪哇1.8提供OptionalInt,OptionalLongOptionalDouble.

但我找不到同等的OptionalBoolean班级.

是否有任何技术原因反对OptionalBoolean

* 一个Optional可以或可以不具有一个值的情况下,使用作为替代null.

java monads boolean optional java-8

32
推荐指数
2
解决办法
7902
查看次数

Haskell有变量吗?

我经常听说Haskell没有变量的说法; 特别是,这个答案声称它没有,它至少被投票了九次并被接受.

那么它是否有变量,为什么?

这个问题似乎也适用于ML,F#,OCaml,Erlang,Oz,Lava和所有SSA中间语言.

variables monads haskell immutability referential-transparency

31
推荐指数
3
解决办法
3万
查看次数

map与mapM行为

我正在使用Real World Haskell的I/O章节.Monads在本书中未讨论另外7章.也就是说,我对I/O的理解充其量是不完整的.

现在我正在尝试理解mapM功能.据我所知,函数"执行"列表中的每个元素必须是"动作"(IO monad).

没有意义的是这个例子.为什么mapM返回的结果与映射相同的参数不同?

Prelude> map (\x -> [x]) [0, 1, 2]
[[0],[1],[2]]
Prelude> mapM (\x -> [x]) [0, 1, 2]
[[0,1,2]]

monads haskell map

31
推荐指数
2
解决办法
9454
查看次数

使用continuation monad在`Set`(以及具有约束的其他容器)上构造有效的monad实例

Set,类似于[]具有完美定义的monadic操作.问题是它们要求值满足Ord约束,因此不可能定义return并且>>=没有任何约束.同样的问题适用于需要对可能值进行某种约束的许多其他数据结构.

标准技巧(在haskell-cafe帖子中向我建议)是包含Set在延续monad中.ContT并不关心底层类型仿函数是否有任何约束.只有在将Sets 包装/展开到continuation中时才需要约束:

import Control.Monad.Cont
import Data.Foldable (foldrM)
import Data.Set

setReturn :: a -> Set a
setReturn = singleton

setBind :: (Ord b) => Set a -> (a -> Set b) -> Set b
setBind set f = foldl' (\s -> union s . f) empty set

type SetM r a = ContT r Set a

fromSet :: (Ord r) => Set a …
Run Code Online (Sandbox Code Playgroud)

monads complexity-theory continuations haskell curry-howard

31
推荐指数
2
解决办法
1534
查看次数

ArrowLoop如何运作?还有,mfix?

我现在对箭头机械的其余部分感到相当舒服,但我不知道循环是如何工作的.这对我来说似乎很神奇,这对我的理解不利.我也很难理解mfix.当我查看一个rec在块procdo块中使用的代码时,我感到困惑.使用常规的monadic或箭头代码,我可以逐步完成计算并保持头脑中正在发生的事情.当我到达时rec,我不知道要保留什么图片!我卡住了,我无法推断这样的代码.

我试图解决的例子来自Ross Paterson关于箭头的论文,关于电路的论文.

counter :: ArrowCircuit a => a Bool Int
counter = proc reset -> do
        rec     output <- returnA -< if reset then 0 else next
                next <- delay 0 -< output+1
        returnA -< output
Run Code Online (Sandbox Code Playgroud)

我假设如果我理解这个例子,我将能够理解循环,这将是理解mfix的一个很好的方法.他们对我的感觉基本上是一样的,但也许我有一个微妙的缺失?无论如何,我真正想要的是这些代码片段的操作画面,所以我可以在头脑中像"常规"代码一样介绍它们.

编辑:感谢Pigworker的回答,我开始考虑rec和满足要求.取counter实施例中,REC块的第一行需要一个叫做值output.我想象这可以创建一个盒子,标记它output,并要求rec块填充那个盒子.为了填充该框,我们为returnA提供一个值,但该值本身需要另一个值,称为next.为了使用这个值,必须要求rec块中的另一行,但是现在要求在rec块中的哪个并不重要.

所以我们转到下一行,我们发现标有框next,我们要求另一个计算填充它.现在,这个计算需要我们的第一个盒子!所以我们给它一个盒子,但它里面没有任何价值,所以如果这个计算需要内容output,我们就会遇到无限循环.幸运的是,延迟占用了盒子,但产生了一个值而没有查看盒子内部.这填补next,然后允许我们填补output.现在output已经填充,当处理该电路的下一个输入时,前一个output框将具有其值,准备被要求以产生下一个next …

monads haskell arrows

30
推荐指数
1
解决办法
2549
查看次数

monad的例子,其应用部分可以比Monad部分更好地优化

在一个讨论中,我听说Applicative一些解析器的接口以不同的方式实现,比它们的Monad接口更有效.原因在于Applicative,在整个有效计算运行之前,我们事先知道所有"效果".对于monad,效果可能取决于计算过程中的值,因此无法进行此优化.

我想看到一些很好的例子.它可以是一些非常简单的解析器或一些不同的monad,这并不重要.重要的是Applicative这样的monad 的接口符合它的returnap,但使用Applicative产生更高效的代码.

更新:只是为了澄清,在这里我对不能成为monad的应用程序不感兴趣.问题是关于两者的事情.

monads performance haskell applicative

30
推荐指数
3
解决办法
1207
查看次数

你能根据`Monads`来定义`Comonads`吗?

好吧,让我们说你有类型

newtype Dual f a = Dual {dual :: forall r. f(a -> r)->r}
Run Code Online (Sandbox Code Playgroud)

事实证明,什么时候f是Comonad,Dual f是Monad(有趣的运动).它是否相反?

您可以定义fmap ab (Dual da) = Dual $ \fb -> da $ fmap (. ab) fbextract (Dual da) = da $ return id,但我不知道如何定义duplicateextend.

这甚至可能吗?如果没有,那么证据不存在(是否有一个特定的Monad m,你可以证明Dual m它不是一个comonad)?

一些观察: Dual IO a基本上Void(并且Const Void是有效的Comonad). Dual m aMonadPlus m Void(只使用dual mzero). …

monads haskell transform comonad

30
推荐指数
1
解决办法
552
查看次数

"有效"究竟是什么意思

一次又一次,我读了长期effectful,但我还是无法给予的是什么意思的明确定义.我认为正确的上下文是effectful 计算,但我也看到了长期effectful )

我曾经认为有效的手段有副作用.但在Haskell中没有副作用(除了某种程度上IO).整个地方仍然有效的计算.

然后我读到monad用于创建有效的计算.我可以在StateMonad 的背景下理解这一点.但我没有看到Maybemonad中有任何副作用.一般来说,在我看来,Monads包含一个类似函数的东西更容易看到产生副作用比Monads只包装一个值.

谈到Applicative仿函数,我更加迷失.我总是看到applicative functor作为一个map带有多个参数的函数的方法.我在这里看不到任何副作用.或者是有之间的差异effectful用的效果

monads haskell side-effects applicative

29
推荐指数
3
解决办法
2035
查看次数