问题标签 [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.

0 投票
1 回答
137 浏览

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 Writermonad 来收集错误。

现在我可以编写一个函数来验证给定元素的子元素:

...并验证序列的第一个元素:

最后我可以重新定义ValidateElementsKleisli

...并重新编写child返回Kleisli而不是函数。

鉴于两者childchildren我可以编写a- 从上面的 XML 验证函数:

是否有意义 ?您将如何纠正/扩展此设计?

0 投票
1 回答
117 浏览

haskell - Haskell 为表达式编写 Monad

我正在尝试设计嵌入式语言,其中操作可以根据值引发某些标志。我预见到对标量值以及向量(例如映射、折叠等)的操作。我的想法是使用 Writer Monad 来跟踪标志。简化示例,其中实际类型为“Int”,如果任何参数为 0,则引发标志。

我不太确定实现这一点的最佳方法是什么。一些问题:

  1. 我应该像 for 一样定义所有操作bpluswbplus?看起来,Latters 让作曲变得更容易了。但是要使用foldM二元运算符应该有类型Int -> Int -> WInt

  2. 列表的合适类型是什么:Writer Any [Int][Wint]

任何建议或想法表示赞赏。

0 投票
1 回答
113 浏览

haskell - 在 WriterT 中包装 Maybe 以添加日志记录

我完全被困住了,我觉得我现在可以使用一些帮助,只是为了保持清醒。我想要一些简单的东西,例如将日志记录功能添加到返回的函数中Maybe,但无论我多么努力,我都无法获得正确的类型。

这是(据我所知)我能得到的最接近的:

这仍然给我一个打字错误:

我应该如何调整代码以使其编译和工作?

非常感谢您的帮助,Haskellers 同胞!

0 投票
2 回答
106 浏览

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.

0 投票
2 回答
104 浏览

haskell - 与 Writer monad 的函数组合?

我正在研究Writer单子并具有以下内容:

错误:

为什么这个计算错误与.而不是$?也许我对函数组合的理解不正确?

0 投票
1 回答
132 浏览

haskell - Writer Monad 嵌套两次

我正在尝试使用 Monad Transformers 两次嵌套 writer monad。这是一个草图:

foo函数无法编译,因为我需要tellStructmonad 上使用,而不是Collision. 有可能吗?

0 投票
1 回答
130 浏览

haskell - 作家单子和无序

我正在使用Writermonad 来跟踪任意值(例如Int)上的错误(“冲突”)标志。一旦设置了标志,它就是“粘性的”,并将其自身附加到作为标记的任何操作的结果产生的所有值上。

有时碰撞标志与单个值相关联,有时我想与组合结构(例如列表)相关联。当然,一旦为整个列表设置了冲突标志,假设它是为单个元素设置的也是有意义的。因此,对于 writer monad m,我需要以下两个操作:

第一个在 Prelude 中定义,而第二个必须定义。是关于如何使用comonads定义它的一个很好的讨论。本机comonad 实现不保留状态。这是一个例子:

产生正确的ex1值,而ex2输出不正确地不保留碰撞标志:

鉴于此,我有两个问题:

  1. 是否可以unsequence使用不特定于 monadic 和 comonadic 运算符来定义Writer
  2. 上面的函数是否有更优雅的实现extend,可能类似于这个

谢谢!

0 投票
1 回答
120 浏览

haskell - 在 Writer monad 中交换`mappend`

摘要:在使用 Writer monad 时,我希望能够在 2 个不同版本之间切换而mappend不会丢失状态。

我使用两个布尔标志来跟踪某些状态:

现在我定义了两个Monoid实例,它们在组合标志的方式上有所不同mappend

现在我可以拥有 2 个具有不同标志处理的 Writer monad:

现在我可以进行如下操作:

现在我想构建如下表达式:

为此,我需要能够在不丢失任何标志的情况下在两者之间进行转换,最好不要打开 monad(使用runWriter)。这部分我还没有弄清楚。看起来有点像我可以尝试使用 monad 转换器嵌套 Writers,但我不确定它是否直接适用于这里。我将不胜感激有关实施此类事情的最佳方法的一些指导。

0 投票
2 回答
256 浏览

scala - 堆叠 monads Writer 和 OptionT

我有以下代码:

我想在处理的每个阶段添加日志记录 - 所以我需要引入 writer monad 并将其与 monad 转换器 OptionT 堆叠。你能建议怎么做吗?

0 投票
2 回答
228 浏览

haskell - 关于 LYAH 中教授的 Writer monad 的问题。(附加到日志是如何发生的?)

我正在从“Learn you a Haskell for Great Good”教程中学习 Haskell,并且我已经完成了关于writer monads的部分。这是我无法弄清楚的例子。

我试图了解块返回wWriter w amonad中的 monoidic 值是如何do改变的。本教程没有详细说明mappending 是如何发生的。

作为 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 的部分被改变的?