Writer Monad 是否保证正确的关联连接?

2024-01-13

它被声称在Haskell 中的验证 https://stackoverflow.com/questions/8721609/validations-in-haskell使用一个Writer保证右关联串联。然而,这个例子似乎表明情况并非如此。正确答案是什么?

{-# LANGUAGE OverloadedStrings #-}

import Control.Monad.Writer
import Data.String

data TM = TMempty
        | TMappend TM TM
        | TMfromString String

instance IsString TM where
  fromString = TMfromString

instance Monoid TM where
  mempty  = TMempty
  mappend = TMappend

instance Show TM where
  showsPrec d TMempty = showString "\"\""
  showsPrec d (TMfromString s) = showString $ show s
  showsPrec d (TMappend a b) = showParen (d > 0) $
    showsPrec 1 a .
    showString " ++ " .
    showsPrec 0 b

theWriter :: Writer TM ()
theWriter = do
  tell "Hello"
  replicateM_ 2 $ tell "World"
  tell "!"

main = print $ execWriter theWriter

生产:

"Hello" ++ ("World" ++ "World" ++ "") ++ "!"

是的,这确实是不真实的。来自源代码 http://hackage.haskell.org/packages/archive/transformers/latest/doc/html/src/Control-Monad-Trans-Writer-Lazy.html:

m >>= k  = WriterT $ do
    ~(a, w)  <- runWriterT m
    ~(b, w') <- runWriterT (k a)
    return (b, w `mappend` w')

...

-- | @'tell' w@ is an action that produces the output @w@.
tell :: (Monoid w, Monad m) => w -> WriterT w m ()
tell w = WriterT $ return ((), w)

所以这个链条mappends 将镜像链(>>=)s.

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

Writer Monad 是否保证正确的关联连接? 的相关文章

  • 整数转浮点数

    这段代码的工作原理 posToXY Float gt Float gt Integer posToXY a b do let y a b round y 但这不起作用 posToXY Integer gt Integer gt Intege
  • 使用 nix 在 Mac OS X 上由于“架构 x86_64 的未定义符号”而导致“堆栈构建”失败

    首先是错误消息 stack build Linking Users yuzhao stack setup exe cache x86 64 osx tmp Cabal simple mPHDZzAJ 2 2 0 1 ghc 8 4 4 cl
  • 如何让 Show 显示函数名称?

    作为一个让我熟悉 Haskell 的简单练习 在 Youtube 上闲逛并偶然进入美国倒计时游戏节目之后 我想为数字游戏制作一个求解器 你得到 6 个数字 需要将它们与 为了得到给定的结果 到目前为止我所得到的是非常脑死亡的 let ope
  • 在 Haskell 中增长数组

    我想在 Haskell 中实现以下 命令式 算法 给定一个序列对 e0 s0 e1 s1 e2 s2 en sn 其中 e 和 s 部分不一定是自然数不同的是 在每个时间步都会随机选择该序列的一个元素 例如 ei si 并根据 ei si
  • 如何手动推断表达式的类型

    给定 Haskell 函数 head filter fst 现在的问题是如何手动 手动 找到类型 如果我让 Haskell 告诉我我得到的类型 head filter fst Bool b gt Bool b 但我想了解仅使用所用函数的签名
  • 无点镜头创建不进行类型检查

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

    我在使用 Turtle 时遇到了一些困难 直到盯着难以理解的错误消息几分钟后才意识到我使用了错误的fold功能 https hackage haskell org package turtle 1 5 8 docs Turtle Shell
  • 如何在 Haskell 中向右或向左移动列表的 1 个元素?

    嗨 我一直在寻找答案 但找不到 假设我们有一个像这样的列表 1 10 4 5 3 我怎样才能将 5 向左移动 使这个列表变成 1 10 5 4 3 我尝试过了swapElementsAt通过找到该元素的索引 但它看起来非常不足 swapEl
  • Haskell 中列表列表的笛卡尔积

    给定一个长度列表的列表x所有子列表的长度都相同y 输出y x长度列表x包含每个子列表中的一项 例子 x 3 y 2 1 2 3 4 5 6 Output 2 3 8不同的输出 1 3 5 1 4 5 1 3 6 1 4 6 2 3 5 2
  • 标准的能力

    我发现了一些使用标准的旧例子here http www serpentine com blog 2009 09 29 criterion a new benchmarking library for haskell 看起来好像早在 2009
  • Haskell 中的尾递归字符串分割

    我正在考虑分割字符串的问题s在一个字符处c 这表示为 break c s 其中 Haskell 库定义break c 足够接近 br br s h t if c h then s else let h t br t in h h t 假设我
  • 用于遇到 [...] 的 Haskell Parsec 解析器

    我正在尝试使用 Parsec 在 Haskell 中编写一个解析器 目前我有一个可以解析的程序 test x 1 2 3 end 执行此操作的代码如下 testParser do reserved test v lt identifier
  • : 中缀运算符在 Haskell 中的作用是什么?

    我正在阅读Haskell 简要介绍 http www haskell org tutorial index html 这不是那么温和 并且它反复使用 操作符而不直接解释它的作用 那么 它到底有什么作用呢 是 前置 运算符 x xs 返回一个
  • 这个对自身单位的列表理解是如何工作的?

    在 haskell IRC 频道中有人问 是否有一种简洁的方法来定义一个列表 其中第 n 个条目是之前所有条目的平方和 我认为这听起来像一个有趣的谜题 递归定义无限列表是我真正需要练习的事情之一 所以我启动了 GHCi 并开始尝试递归定义
  • 为什么 ZipList 不是 List 的默认应用实例

    我目前正在学习 Haskell 中的应用程序 如果我没记错的话 列表有两个不同的应用实例 List and ZipList 第二个被定义为包装列表值的新类型 这ZipList应用实例对我来说似乎更直观 这可能是一个愚蠢的问题 但有具体原因吗
  • 带有 RankNTypes 扩展的奇怪类型推断

    我正在尝试在 Haskell 中尝试 System F 类型 并通过以下方式实现了自然数的 Church 编码type 当加载这段代码时 OPTIONS GHC Wall LANGUAGE RankNTypes type CNat fora
  • 不同编程语言中的浮点数学

    我知道浮点数学充其量可能是丑陋的 但我想知道是否有人可以解释以下怪癖 在大多数编程语言中 我测试了 0 4 到 0 2 的加法会产生轻微的错误 而 0 4 0 1 0 1 则不会产生错误 两者计算不平等的原因是什么 在各自的编程语言中可以采
  • 如何在不声明新数据的情况下更改类型(String,Int)元组的 Ord 实例?

    我正在尝试对类型列表进行排序 String Int 默认情况下 它按字符串排序 然后按整数排序 如果字符串相等 我希望它是相反的 首先比较整数 然后如果相等则比较字符串 另外 我不想切换到 Int String 我找到了一种通过定义实例来实
  • Haskell:不在范围内:数据构造函数

    今天开始在学校学习 haskell 我遇到了函数问题 我不明白为什么它不在范围内 代码如下 ff Char gt Char gt Char ff A B x 0 y 1 x lt A y lt B x 1 y 0 和错误 md31 hs 2
  • ST monad 是如何工作的?

    我知道 ST monad 有点像 IO 的弟弟 而 IO 又是添加了状态 monadRealWorld魔法 我可以想象状态 也可以想象 RealWorld 以某种方式放入 IO 中 但每次我写一个类型签名ST the sST monad 的

随机推荐

  • Python“除了”失败

    我想知道你是否可以重新引发一个 特定的 捕获的异常 并让它被稍后的 一般的 捕获 除了在同一个 try except 中 例如 我想对特定的 IOError 执行某些操作 但如果它不是预期的 IOError 则应像处理任何其他错误一样处理该
  • Python 中的图像抓取程序未按预期运行

    我的代码只返回一个空字符串 我不知道为什么 import urllib2 def getImage url page urllib2 urlopen url page page read Gives HTML to parse start
  • Z_DATA_ERROR,ERRNO -3,zlib:数据检查不正确,MBA M1

    最近 我在 MacBook Air M1 机器上使用最新的 Node 和 NPM 安装依赖项时遇到了问题 然后我发现M1不支持最新的Node版本 所以我的解决方案是使用 NVM 并将其更改为 Node v14 16 一切都运行良好 但是当我
  • Angular 2:“...”的路由生成器未包含在传递的参数中

    所以我的 AuthenticationService 中有以下代码 检查登录凭据后 用户将被重定向到他们的个人资料 authentication service ts redirectUser username string void Re
  • 适用于 Android 的 Tensorflow 量化图

    我正在尝试将量化图表加载到 Android 应用程序中 我的构建文件包含 deps tensorflow core android tensorflow lib tensorflow contrib quantization cc arra
  • 多个描述元标记有效吗?

    用不同的语言定义多个元描述是否有效 这是有效的吗 有效 是的 搜索引擎正确处理 目前看来并非如此 大多数 SEO 验证者都会抱怨多个描述 即使它们被标记为不同的语言代码 并且如前所述 在某些情况下会被视为垃圾邮件进行处罚 没有理由不让一个页
  • 消费者不使用 Riverpod 重建 UI

    我正在尝试使用 Riverpod 制作简单的 stateNotifier 当我单击按钮时 它将在值之间切换 我检查了该值 按下按钮时它会发生变化 问题是 UI 没有自行重建 我已经检查了文档并且非常确定我做得正确 主屏幕 class Hom
  • 如何在生成下载文件时显示加载动画?

    我有一个 Web 应用程序 用户可以在其中生成 PDF 和 PowerPoint 文件 这些文件可能需要一些时间才能生成 因此我希望能够在生成时显示加载动画 这里的问题是我无法知道下载何时开始 动画永远不会消失 我知道可以 在侧面 生成文件
  • 通过本机 Java API 验证 Windows 用户凭据

    我需要存储 Windows 用户名和凭据 以便稍后运行一些需要这些凭据的进程 当我收集这些作为用户的输入时 我想验证凭据是否正确 Java 中是否有原生 api 可以帮助我验证 Windows 系统凭据 我正在经历LoginContext类
  • 第一个 li 的 JQuery 选择器

    当用户单击第一个 li 又名 任何日期 时 我需要一个 onclick 事件 如何使用 jQuery 选择该元素 ul class ui menu ui widget ui widget content li class ui menu i
  • 为什么 Swift 会隐式解包可选的“nil”?

    self presentTextInputControllerWithSuggestions nil allowedInputMode WKTextInputMode Plain results AnyObject gt Void in r
  • 出生日期限制

    我想将日期选择器对话框限制为至少选择 18 岁 val c Calendar getInstance val year c get Calendar YEAR val month c get Calendar MONTH val day c
  • 如何实现基于行的文件内容的并行处理

    我正在编写一个 POC 来处理一个非常大的文本文件 约 10 亿行以上 并正在为此尝试使用 Go package main import bufio fmt log os time func main start time Now file
  • 相互递归类

    如何在 C 中实现相互递归类 就像是 Recursion h ifndef RECURSION H define RECURSION H class Class1 Class2 Class2 ptr public void Class1 m
  • 访问 TKinter 脚本中的主线程?

    我想明白为什么我收到以下错误TclStackFree incorrect freePtr Call out of sequence 但我不知道如何解决这个问题 我的脚本摘要 My Python TKinter脚本由三个活动线程组成 主线程和
  • 学习 JavaScript 的好资源 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何生成新的 shell 以从基本 Python 脚本运行 Python 脚本?

    我已经成功运行了几个 Python 脚本 并使用 subprocess 模块从基本脚本调用它们 subprocess popen sys executable script py shell True 但是 每个脚本都会执行一些模拟 来自
  • 当检索方法无法产生返回值时,它应该返回“null”还是抛出异常? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我使用java语言 我有一个方法 如果找到一个对象 它应该返回一个对象 如果没有找到 我应该 返回空值 抛出异常 other 哪个是最佳实践或习
  • 在 Haskell 中,性能和绑定

    我刚刚学习 Haskell 并从教程网站编写了两个程序 这样 maximumnowhere Ord a gt a gt a maximumnowhere error empty maximumnowhere x x maximumnowhe
  • Writer Monad 是否保证正确的关联连接?

    它被声称在Haskell 中的验证 https stackoverflow com questions 8721609 validations in haskell使用一个Writer保证右关联串联 然而 这个例子似乎表明情况并非如此 正确