问题标签 [writer-monad]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
scala - 在 Scala 中使用 Writer 和 Kleisli 验证 XML
这是我之前的问题的后续
假设我需要验证这样的 XML:
我需要确保根元素有 labela
并且也有 children <a1>xxx</a1>
, <a2>yyy</a2>
,<a3>zzz</a3>
按此顺序。
我想List[String]
用来收集错误并定义一个函数来验证单个 XML 元素,如下所示:
现在我可以编写函数来验证给定 XML 元素的标签、文本和属性:
我可以用|+|
因为ValidateSingleElement
是一个幺半群来组合这些函数。
现在我需要一个函数来验证给定元素的子元素。为了编写这样一个函数,我需要另一个函数来验证一系列元素
ValidateElements
定义如下:
我在遍历元素序列时使用List[String]
and Writer
monad 来收集错误。
现在我可以编写一个函数来验证给定元素的子元素:
...并验证序列的第一个元素:
最后我可以重新定义ValidateElements
为Kleisli
...并重新编写child
返回Kleisli
而不是函数。
鉴于两者child
,children
我可以编写a
- 从上面的 XML 验证函数:
是否有意义 ?您将如何纠正/扩展此设计?
haskell - Haskell 为表达式编写 Monad
我正在尝试设计嵌入式语言,其中操作可以根据值引发某些标志。我预见到对标量值以及向量(例如映射、折叠等)的操作。我的想法是使用 Writer Monad 来跟踪标志。简化示例,其中实际类型为“Int”,如果任何参数为 0,则引发标志。
我不太确定实现这一点的最佳方法是什么。一些问题:
我应该像 for 一样定义所有操作
bplus
吗wbplus
?看起来,Latters 让作曲变得更容易了。但是要使用foldM
二元运算符应该有类型Int -> Int -> WInt
。列表的合适类型是什么:
Writer Any [Int]
或[Wint]
?
任何建议或想法表示赞赏。
haskell - 在 WriterT 中包装 Maybe 以添加日志记录
我完全被困住了,我觉得我现在可以使用一些帮助,只是为了保持清醒。我想要一些简单的东西,例如将日志记录功能添加到返回的函数中Maybe
,但无论我多么努力,我都无法获得正确的类型。
这是(据我所知)我能得到的最接近的:
这仍然给我一个打字错误:
我应该如何调整代码以使其编译和工作?
非常感谢您的帮助,Haskellers 同胞!
monads - 如何在“do”块(PureScript)中访问 Writer monad 的值和累加器?
我现在正在学习 Writer monad,我不确定要在一个do
块中读取 monad 的值和累加器是否正确。例如,在下面的 coltzSeq 函数中,我想读取 Array 累加器的长度作为函数的最终计算。是否可以这样做或这是对 Writer 的不正确使用?显然,我可以让调用者读取最终数组的长度,或者我可以使用 State monad,但这只是我的练习。
编辑:我尝试了 gb. 的建议并尝试使用listens
具有 type 的函数(Monoid w, Monad m) => forall w m a b. MonadWriter w m => (w -> b) -> m a -> m (Tuple a b)
。如果我们id
在这种情况下使用类型将是......
所以listens id
接受Writer (Array Number) Number)
,并返回一个值为当前 Writer 状态的 Writer(因为我们使用了id
)。但是,我尝试和使用的所有方式都不断出现类型错误listens
Edit2:我想出了我需要做什么。出于某种原因,我需要在使用listens
.
haskell - 与 Writer monad 的函数组合?
我正在研究Writer
单子并具有以下内容:
错误:
为什么这个计算错误与.
而不是$
?也许我对函数组合的理解不正确?
haskell - Writer Monad 嵌套两次
我正在尝试使用 Monad Transformers 两次嵌套 writer monad。这是一个草图:
该foo
函数无法编译,因为我需要tell
在Struct
monad 上使用,而不是Collision
. 有可能吗?
haskell - 作家单子和无序
我正在使用Writer
monad 来跟踪任意值(例如Int
)上的错误(“冲突”)标志。一旦设置了标志,它就是“粘性的”,并将其自身附加到作为标记的任何操作的结果产生的所有值上。
有时碰撞标志与单个值相关联,有时我想与组合结构(例如列表)相关联。当然,一旦为整个列表设置了冲突标志,假设它是为单个元素设置的也是有意义的。因此,对于 writer monad m
,我需要以下两个操作:
第一个在 Prelude 中定义,而第二个必须定义。这是关于如何使用comonads定义它的一个很好的讨论。本机comonad 实现不保留状态。这是一个例子:
产生正确的ex1
值,而ex2
输出不正确地不保留碰撞标志:
鉴于此,我有两个问题:
- 是否可以
unsequence
使用不特定于 monadic 和 comonadic 运算符来定义Writer
? - 上面的函数是否有更优雅的实现
extend
,可能类似于这个?
谢谢!
haskell - 在 Writer monad 中交换`mappend`
摘要:在使用 Writer monad 时,我希望能够在 2 个不同版本之间切换而mappend
不会丢失状态。
我使用两个布尔标志来跟踪某些状态:
现在我定义了两个Monoid
实例,它们在组合标志的方式上有所不同mappend
:
现在我可以拥有 2 个具有不同标志处理的 Writer monad:
现在我可以进行如下操作:
现在我想构建如下表达式:
为此,我需要能够在不丢失任何标志的情况下在两者之间进行转换,最好不要打开 monad(使用runWriter
)。这部分我还没有弄清楚。看起来有点像我可以尝试使用 monad 转换器嵌套 Writers,但我不确定它是否直接适用于这里。我将不胜感激有关实施此类事情的最佳方法的一些指导。
scala - 堆叠 monads Writer 和 OptionT
我有以下代码:
我想在处理的每个阶段添加日志记录 - 所以我需要引入 writer monad 并将其与 monad 转换器 OptionT 堆叠。你能建议怎么做吗?
haskell - 关于 LYAH 中教授的 Writer monad 的问题。(附加到日志是如何发生的?)
我正在从“Learn you a Haskell for Great Good”教程中学习 Haskell,并且我已经完成了关于writer monads的部分。这是我无法弄清楚的例子。
我试图了解块返回w
的Writer w a
monad中的 monoidic 值是如何do
改变的。本教程没有详细说明mappend
ing 是如何发生的。
作为 monad的类型声明Writer
和实例声明Writer
由教程给出
如果根据实例声明return x
产生结果Writer (x, mempty)
并且mempty
对于 monoid[a]
是[]
,不应该return (a*b)
,等于return (3*5)
,评估为(15,[])
?
我把上面的命令给了 ghci ,它返回一个WriterT
类型值,元组包含一个空列表,正如预期的那样。
我改用do
绑定运算符重写了该块。上面的代码给出了与教程中的原始代码相同的结果。
我的印象是>>=
只Int
3
从结果中提取logNumber 3
并将其提供给(\a -> logNumber 5 ...etc.)
,然后logNumber
在不同的值 ( 5
) 上执行函数,依此类推。这些操作是如何导致[String]
Writer monad 的部分被改变的?