问题标签 [state-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.
haskell - 状态单子的范围
我试图理解以下代码中发生了什么,代码行为正常,但我试图理解为什么。
我不明白为什么每次连续调用 loopArgs 时 State monad 的状态都不会“重置”。状态是否作为变量传递,>>
如果是的话,有人可以告诉我怎么做吗?
haskell - 为什么作者声称这个函数调用不是递归调用?
作者声称下一个调用不是递归调用,但我不明白为什么。
资料来源:http ://courses.cms.caltech.edu/cs11/material/haskell/lectures/haskell_lecture_5.pdf
haskell - 如何使用 JuicyPixels 写入像素?(在 ST 单子中)
我想将一些像素写入图像,并将图像写入磁盘。我一直在遵循我从许多 Haskeller 那里听到的建议来遵循类型签名,并且基本上玩“类型俄罗斯方块”,直到我到达我要去的地方。它主要为我工作,但我遇到了一些麻烦。
要写一个像素,有一个函数:
我可以通过阅读签名告诉我需要将 MutableImage 传递给它,所以我寻找一个带有 MutableImage 的函数:
这似乎在某种状态单子中运行。
这有效,并返回我可以写入磁盘的漂亮灰色图像。但我不知道如何获取 MutableImage 以便我可以将像素写入它!简单地插入 writePixel 调用会给我一个我无法弄清楚的错误:
结果是:
我可以从 writePixel 签名中看出我缺少 writePixel 的第一个参数。如何获得对 MutableImage 的引用,以便我可以写入它?更重要的是,我如何在这个 monad 中的类型上找到立足点,以便我自己解决这些问题?
haskell - 创建我自己的 State monad
我了解如何使用单子,但我并不真正掌握如何创建单子。所以我正在重建一个状态单子的旅程。
到目前为止,我已经创建了一个新类型 Toto(法语中的 foo)并将其作为 Monad 的一个实例。现在我正在尝试为其添加“阅读器功能”。我创建了一个 TotoReader 类,它声明了一个“get”函数。但是当我尝试实例化它时,一切都崩溃了。GHC 告诉我它无法推断 (m ~ r) (底部的完整编译错误)。
但是当我创建一个顶级函数 get 时,一切正常。
那么如何在一个类中定义一个 get 函数,它真的是正确的方法吗?什么是我不明白的?
到目前为止我的代码如下
编译错误
haskell - 如何使用 Supply monad 创建一个生成全局唯一名称的函数?
背景:
我正在做一个代码翻译项目,需要我生成变量名。我生成的名字都不应该是重复的。
我真的很沮丧,因为使用 Python 生成器函数会非常简单和优雅。
我试过的:
我之前这样做的方式是通过递归调用我的翻译代码向下传递一个计数器变量,并在基本上每个函数的返回值中传递(可能递增的)计数器。
这真的很混乱:它添加了一个额外的参数来跟踪每个函数;更糟糕的是,它迫使我使用凌乱的元组返回值,否则我会得到一个简单的一元返回值。
在我使用 Haskell 的短时间内,我从来没有真正精通过 monad,但我有一种想法,我可以在State
monad 上使用包装器来模拟全局计数器变量。在尝试 grok monad 并制作自己的 monad 3 天后,尝试改变其他人的 monad 以生成我需要的值,我终于让自己直接使用其他人的高级 monad(也许有一些改动。)
我现在的问题:
我已将MonadSupply和MonadUnique模块确定为可能提供我需要的简单接口的一对。不幸的是,我不知道如何使用它们。
特别是MonadSupply
模块文档提供了这个很好的示例用例:
看起来像我想要的!一旦我得到了要编译的模块,我在解释器中检查了这个函数的类型:
我尝试将很多(价值数小时)不同的东西传递给这个函数,但没有成功。我还尝试将函数传递给其他各种函数,以查看它们是否会隐式提供我需要的参数。到目前为止没有运气。
问题:
runSupplyVars
有人可以提供此功能的示例用例吗?
有可能用它做我想做的事吗?我想要一个可以从程序中的任何位置调用的函数,它会在每次调用时为我提供不同的变量名或整数。
haskell - 为什么我可以在不提供 monad 的情况下调用 monadic 函数?
我以为我对 Haskell Monads 有很好的处理,直到我意识到这段非常简单的代码对我来说毫无意义(这是来自关于 State monad 的 haskell wiki):
让我困惑的是,当提供的唯一参数是字符串时,为什么允许代码调用“get”?似乎它几乎是凭空产生了价值。
我提出这个问题的一种更好的方法可能是,如何使用>>=
and lambda's 而不是 do 表示法重写这个函数?我自己无法弄清楚。
haskell - 结合状态和列表单子
考虑以下 Haskell 代码:
这会产生以下输出:
但是,我想生成以下输出:
用 JavaScript 这样的不纯语言很容易做到这一点:
你如何在 Haskell 中做同样的事情?
haskell - 失败时如何保存信息?
我正在编写一些使用StateT
monad 转换器来跟踪一些有状态信息(日志记录等)的代码。
我传递给的 monadStateT
非常简单:
它只是一个Left
和Right
变体。
困扰我的是fail
. 在我的计算中,我在这个 monad 中产生了很多信息,即使失败,我也想保留这些信息。目前,我唯一能做的就是将所有内容转换为 aString
并创建一个Bad
实例,并将String
作为参数传递给fail
.
我想做的是:
然而,到目前为止我尝试的所有内容都会出现类型错误,可能是因为这会混合不同的单子。
无论如何我可以实施fail
以保留我需要的信息而不必将所有信息转换为String
?
我无法相信 Haskell 可以实现的最佳效果是使用show
+read
将所有信息作为字符串传递给fail
.
scala - 在scalaz中堆叠StateT
我试图通过移植 Dan Piponi 的本教程中的一些示例来理解 Scala 中的 Monad Transformers:http: //blog.sigfpe.com/2006/05/grok-haskell-monad-transformers.html
我做了几个简单的:
变成:
但是我怎么能把下一个例子移植到 Scala 中呢?
我已经使用 scalaz 7.1.0-M6 做到了这一点:
但这还没有接近,据我所知甚至可能倒退。
我当然可以这样做:
但是我根本没有使用stacked StateT,所以它没有回答这个问题。
提前致谢!
haskell - 如何将可变向量放入状态单子
我在 haskell 中编写了一个小程序,使用带有 Vector 的 State Monad 来计算 Tree 中所有 Int 值的出现次数:
但是不可变向量的“更新”是以 O(n) 复杂度完成的。我正在寻找 O(1) 中的更新和 O(1) 中的访问。据我了解,可变向量做我想做的事。要使用它们,我需要使用 ST 或 IO。因为我想做一些单元测试,所以我更喜欢 ST monad,但我不想在函数调用中传递那个向量。我需要继续使用 Monad Transformers,因为我将添加像 ErrorT 和 WriterT 这样的转换器。
问题:如何使用 Monad Transformers 将可变向量放入 State Monad?
我想出了以下无法编译的代码:
编译错误是:
注意:我知道不检查边界。