任何人都可以解释(更好的用简单英语的例子)列表monad可以做什么来模拟非确定性计算?即问题是什么以及列表monad可以提供什么解决方案.
显然唯一可能的解释runSomeMonad do ...是runSomeMonad (do ...).为什么不是Haskell语法允许的第一个变体?有些情况foo do bar可能实际上是模棱两可的吗?
作为一种原始的版本Optional*,爪哇1.8提供OptionalInt,OptionalLong和OptionalDouble.
但我找不到同等的OptionalBoolean班级.
是否有任何技术原因反对OptionalBoolean?
*
一个Optional可以或可以不具有一个值的情况下,使用作为替代null.
我经常听说Haskell没有变量的说法; 特别是,这个答案声称它没有,它至少被投票了九次并被接受.
那么它是否有变量,为什么?
这个问题似乎也适用于ML,F#,OCaml,Erlang,Oz,Lava和所有SSA中间语言.
variables monads haskell immutability referential-transparency
我正在使用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]]
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) 我现在对箭头机械的其余部分感到相当舒服,但我不知道循环是如何工作的.这对我来说似乎很神奇,这对我的理解不利.我也很难理解mfix.当我查看一个rec在块proc或do块中使用的代码时,我感到困惑.使用常规的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 …
在一个讨论中,我听说Applicative一些解析器的接口以不同的方式实现,比它们的Monad接口更有效.原因在于Applicative,在整个有效计算运行之前,我们事先知道所有"效果".对于monad,效果可能取决于计算过程中的值,因此无法进行此优化.
我想看到一些很好的例子.它可以是一些非常简单的解析器或一些不同的monad,这并不重要.重要的是Applicative这样的monad 的接口符合它的return和ap,但使用Applicative产生更高效的代码.
更新:只是为了澄清,在这里我对不能成为monad的应用程序不感兴趣.问题是关于两者的事情.
好吧,让我们说你有类型
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) fb和extract (Dual da) = da $ return id,但我不知道如何定义duplicate或extend.
这甚至可能吗?如果没有,那么证据不存在(是否有一个特定的Monad m,你可以证明Dual m它不是一个comonad)?
一些观察:
Dual IO a基本上Void(并且Const Void是有效的Comonad).
Dual m a为MonadPlus m 是 Void(只使用dual mzero). …
一次又一次,我读了长期effectful,但我还是无法给予的是什么意思的明确定义.我认为正确的上下文是effectful 计算,但我也看到了长期effectful 值)
我曾经认为有效的手段有副作用.但在Haskell中没有副作用(除了某种程度上IO).整个地方仍然有效的计算.
然后我读到monad用于创建有效的计算.我可以在StateMonad 的背景下理解这一点.但我没有看到Maybemonad中有任何副作用.一般来说,在我看来,Monads包含一个类似函数的东西更容易看到产生副作用比Monads只包装一个值.
谈到Applicative仿函数,我更加迷失.我总是看到applicative functor作为一个map带有多个参数的函数的方法.我在这里看不到任何副作用.或者是有之间的差异effectful并用的效果?
monads ×10
haskell ×9
applicative ×2
arrows ×1
boolean ×1
comonad ×1
curry-howard ×1
do-notation ×1
f# ×1
immutability ×1
java ×1
java-8 ×1
map ×1
optional ×1
performance ×1
side-effects ×1
syntax ×1
transform ×1
variables ×1