状态 Monad 的传播

2024-01-06

我有以下函数用于在游戏世界的“图形”的“边缘”行走。它改变了世界的状态——特别是玩家的位置。我还需要报告一条消息,提醒玩家位置发生变化。

所以我可以返回一个 (message, newWorld) 元组,或者我可以使用 State monad。 (对吧?我对这东西很陌生。)

这是我对 monad 方法的尝试:

walk dir = do
  world <- get
  let attempt = filter (\e -> edgeDirection e == dir) $ edges
      edges = (worldEdges world) M.! playerLoc
      playerLoc = playerLocation $ worldPlayer world
  case attempt of
    [] -> return "You can't go that way."
    (edge : _) -> do
      put world' 
      return message
        where world' = world { worldPlayer = player' }
              player' = (worldPlayer world) { playerLocation = loc }
              loc = edgeLocation edge
              message = "You go " ++ (downcase $ show dir)

问题是,现在的功能是calls walk有一个 State monad 需要处理。我是吗runState它就在那里,或者我也有使用 State monad 的函数,如下所示:

parseWalk dir =
  let direction = case dir of
                  ('e' : _) -> Just East
                  ('n' : _) -> Just North
                  ('s' : _) -> Just South
                  ('w' : _) -> Just West
                  ('u' : _) -> Just Up
                  ('d' : _) -> Just Down
                  _         -> Nothing
  in case direction of
    Just d -> walk d
    Nothing -> return "You can't go that way"

那么呢parseWalk的来电者等等?我应该尝试让这个 State monad 尽可能长时间地传递吗?我应该看到很多MonadState ...在我的类型签名中?


这是一种思考方式:runState需要一个初始状态作为其参数。您的代码中哪里可以使用此初始状态?这就是状态单子需要传播的距离。

注意runState封装有状态计算,所以如果你有两个runState并排计算时,它们不会看到彼此的状态(除非您将结果从一个传递给另一个。)这也应该给您提示“向上”多远runState需要是。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

状态 Monad 的传播 的相关文章

  • 使用 Template Haskell 生成函数

    是否可以使用 Template Haskell 定义函数 例如 convertStringToValue String gt Int convertStringToValue three 3 convertStringToValue fou
  • Foldl 是否比其严格的表亲 Foldl' 更好?

    Haskell 有两个列表左折叠函数 foldl 以及 严格 版本 foldl 不严格的问题foldl是它建造了一座重击塔 foldl 0 1 5 gt 0 1 2 3 4 5 gt 15 这会浪费内存 并且如果列表中的项太多 可能会导致堆
  • XMonad 在不同工作区启动

    我想在 xmonad start 上启动不同工作区中的一些应用程序 这很重要 所以 我写了以下内容startupHook startupApps String startupApps konsole emacs firefox gvim k
  • 我需要什么类型签名才能将函数列表转换为 Haskell 代码? [复制]

    这个问题在这里已经有答案了 可能的重复 为什么 haskell 中不允许这样的函数定义 https stackoverflow com questions 6168880 why is such a function definition
  • unsafeInterleaveIO 什么时候不安全?

    与其他不安全 操作不同 文档 http hackage haskell org packages archive base latest doc html System IO Unsafe html v unsafeInterleaveIO
  • 有可能吗?:行为 t [行为 t a] -> 行为 t [a]

    有没有办法有一个Behavior t a 其中 a 在时间 t 的值是 a 中包含的值Behavior t Behavior t a 在时间 t 即 具有以下类型的函数 Behavior t Behavior t a gt Behavior
  • 在 Windows 上使用堆栈安装 SDL2 for Haskell

    我正在尝试将 SDL2 与堆栈一起使用 我跟着这些说明 https www reddit com r haskellgamedev comments 4jpthu windows sdl2 is now almost painless vi
  • 在 Haskell 中将 Maybe Int 转换为 Int

    我正在编写以下代码 并希望找到框字符串中数字的索引 所以我用了findIndex但它返回Maybe Int值 而我只想要Int value 我怎样才能转换Maybe Int to Int值或者有什么方法可以提取Int from Maybe
  • 移动列表中特定元素的简单函数

    我是 Haskell 的新手 我正在尝试弄清楚如何创建一个函数 shift Eq a gt a gt a gt Int gt a shift x h t z 输入 一个通用列表和一个相同类型的元素 x 前提条件 元素x存在于列表中 Outp
  • 我可以获得有关过度限制类型签名的警告吗?

    当我为可能更具多态性的函数提供类型签名时 GHC 或某些 lint 工具可以告诉我吗 GHC 不这样做 快速搜索 Hackage 也没有发现任何结果 实现这样的事情的一个简单但可能非常有效的方法是在 GHCi 中加载模块 使用 browse
  • React Native 将样式设置为 State

    我想用backgroundColor of style1作为一种状态 并在函数中改变它change 我怎样才能访问style1 我的观点是调用该函数change从另一个函数 使按钮将其颜色更改为黄色 然后在一段时间后再次将其颜色更改为蓝色
  • 在函数调用之间保存数据的Pythonic方式是什么?

    对我来说 上下文是我需要在调用修改该值的函数之间保留的单个 int 的信息 我可以使用全局 但我知道这是不鼓励的 现在 我使用了包含 int 的列表形式的默认参数 并利用了可变性 以便在调用之间保留对值的更改 如下所示 def increm
  • 使用 Promise 语法编写同步代码有什么好处吗?

    有同步承诺这样的概念吗 使用 Promise 语法编写同步代码有什么好处吗 try foo bar a b bam catch e handleError e 可以写成类似的东西 但使用同步版本then foo then bar bind
  • 在 Haskell 中计算移动平均线

    我正在学习 Haskell 所以我尝试实现移动平均函数 这是我的代码 mAverage Int gt Int gt Float mAverage x a fromIntegral k fromIntegral x k lt rawAvera
  • Haskell 中的实例声明

    我有这两个功能 primes sieve 2 where sieve p xs p sieve x x lt xs x mod p gt 0 isPrime number number 1 null x x lt takeWhile x g
  • 将数据类型设置为 Kind * -> * 这不是函子

    布伦特 约尔吉类型分类百科全书 https www haskell org haskellwiki Typeclassopedia给出以下练习 举一个类型的例子 gt 不能将其制成 的实例Functor 不使用undefined 请告诉我什
  • 无点镜头创建不进行类型检查

    在函数中test 我遍历一个列表 从它的成员生成镜头 然后打印一些数据 当我使用有针对性的呼叫风格时 这会起作用 当我使其成为无点时 它无法进行类型检查 为什么会出现这种情况 我该如何解决这个问题 在我看来 GHC 并没有保留排名较高的信息
  • 如何将数组与 setState 一起使用?

    我目前正在使用以下命令将数组映射到 setState 但没有设置任何内容 也没有记录任何错误 如果我明确地逐行写出它 它就会起作用 关于如何解决这个问题有什么想法或建议吗 使用数组设置状态 不设置状态 const myData messag
  • ViewPager 的 Android Viewholder

    您好 我正在使用 ViewPager 但我现在想保留状态 而不是重新生成单元格 我注意到 viewpager 与 listviews 的自定义适配器非常相似 它们的功能类似 listview 在单元格不再出现在屏幕上后重新生成单元格中的数据
  • 规范化且不可变的数据模型

    Haskell如何解决 规范化不可变数据结构 问题 例如 让我们考虑一个表示前女友 男友的数据结构 data Man Man name String exes Woman data Woman Woman name String exes

随机推荐

  • 泛型和约束多态性与子类型

    In this PDF 演示文稿 http research microsoft com en us um people simonpj papers haskell retrospective ECOOP July09 pdf关于 Has
  • Pytest Monkeypatch 不适用于导入的函数

    假设一个项目中有两个包 some package and another package some package foo py def bar print hello another package function py from so
  • 如何格式化来自 MongoDB 的日期?

    我正在使用 Jade 从 Express js 中呈现我的视图 我正在 MongoDB 中保存文档并使用 Mongoose 访问我的文档 我正在保存创建新文档时创建的默认日期 并将该日期创建属性返回到需要格式化的视图 MongoDB 中存储
  • jquery ui 可调整大小的自定义句柄错误

    我试图让自定义句柄与 jquery ui 可调整大小的小部件一起使用 但是当我使用handles 选项将 jquery 引用传递给另一个元素时 它失败了 从我从文档和网络上的其他示例中读到的内容来看 这应该可以正常工作 div class
  • 具有代理支持的 python webkit

    我正在编写一个用于抓取网页的 python 脚本 我创建了一个 webkit webview 对象并使用 open 方法来加载 url 但我想通过代理加载网址 我怎样才能做到这一点 如何将 webkit 与 proxy 集成 哪个 webk
  • 退出自定义 Sails 1 和 Actions 2

    如果我想使用操作 2 在 sails 1 中返回带有状态代码和错误消息的错误的输出 该怎么办 EX exits notFound description not found responseType notFound 怎样才能退出呢 例如
  • 写入 Hadoop 中 HDFS 中的文件

    我一直在寻找一个磁盘密集型 Hadoop 应用程序来测试 Hadoop 中的 I O 活动 但我找不到任何此类应用程序可以使磁盘利用率保持在上述水平 例如 50 或者某些此类应用程序实际上使磁盘保持繁忙 我尝试了 randomwriter
  • 为什么编译器在 N 字节边界上对齐 N 字节数据类型?

    我不明白为什么编译器在 4 字节边界上对齐 int 在 2 字节边界上对齐 Short 在 1 字节边界上对齐 char 据我了解 如果处理器的数据总线宽度是 4 字节 则从不是 4 的倍数的地址读取 int 需要 2 个内存读取周期 那么
  • 导入 ChatKit(即私有框架)或以某种方式使用 CKDBMessage

    首先 我知道私有框架 API 不会让我进入 AppStore 这仅供私人使用 研究 我无法编译我的项目ChatKit framework 基本上我需要以某种方式初始化CKDBMessage对象并从中获取东西 The first我尝试的方法是
  • 查找 STL 队列中是否已存在某个项目

    我正在使用 STL 队列在图上实现 BFS 广度优先搜索 如果队列中不存在该节点 我需要将其推送到队列中 然而 STL队列确实不允许迭代其元素 http www sgi com tech stl queue html 2因此我无法使用 ST
  • 删除表中的所有外键

    我有这个脚本可以在 sql server 2005 中运行 t sql scriptlet to drop all constraints on a table DECLARE database nvarchar 50 DECLARE ta
  • MVVM - 如何将视图模型绑定到视图

    并提前感谢您的指导 我是 MVVM 的新手 我一直通过文章学习 我想我已经走了很远了 但有一件事似乎让我忽略了 我如何 不使用后面代码中的代码 自动绑定到我想要的视图 据我了解 如果做得正确 这就是模式应该如何工作 我可以使用主窗口 xam
  • 有没有办法使用 React-Router v6 设置默认路由

    我只是找不到用react router v6 设置默认路由的方法 是因为现在编程不好了吗 有人能告诉我为什么吗 提前致谢 Rafael 如果我正确理解您关于 默认 路线的问题 那么我将其解释为以下之一 Use an index route
  • 进程可以在其虚拟内存的任何地址上读/写吗?

    操作系统中的进程有自己的虚拟地址空间 比如说 我在 C 程序中使用 malloc 函数调用分配一些动态内存 并从它返回的地址中减去一些正值 比如 1000 现在 我尝试读取该位置上写的内容 这应该没问题 但是写入该位置怎么样 虚拟地址空间也
  • 正则表达式将字符串与可选条件相匹配[重复]

    这个问题在这里已经有答案了 可能的重复 如何在 Ruby 中使正则表达式的一部分成为可选 https stackoverflow com questions 5239883 how do i make part of a regular e
  • 合并python中的字典列表

    我有 python 中的字典 格式如下 dict1 Name a value 20 Name b value 10 Name c value 15 我想要输出类似这样的内容 dict2 a 20 b 10 c 15 怎么做 我认为你可以用
  • 计算相对于当前行匹配条件的行数

    我有一个像这样构造的数据框 但它实际上有大约 400k 行 library data table df lt fread id start end 174095 2018 12 19 2018 12 31 227156 2018 12 19
  • Dragonfly Gem 与 ImageMagick 和 Passenger

    我在让蜻蜓宝石与乘客很好地配合时遇到了一些问题 Passenger 似乎没有使用当前的 PATH 因此它找不到转换二进制文件 我给蜻蜓添加了一些配置 这似乎解决了这个问题 require dragonfly rails images Dra
  • 解决依赖关系时Maven错误

    我是 Maven 新手 正在尝试建立我的第一个POMs 我的应用程序将使用 EhCache 进行缓存 前往 Maven Central Repo 链接here http mvnrepository com artifact net sf e
  • 状态 Monad 的传播

    我有以下函数用于在游戏世界的 图形 的 边缘 行走 它改变了世界的状态 特别是玩家的位置 我还需要报告一条消息 提醒玩家位置发生变化 所以我可以返回一个 message newWorld 元组 或者我可以使用 State monad 对吧