我们怎么知道应用程序不能是 Monad?

2023-12-09

从验证的例子(https://hackage.haskell.org/package/Validation),我试图直观地检测应用程序如何/为什么不能是 Monad (为什么 AccValidation 不能有 Monad 实例?)

你能挑战我的推理吗?

我以我们处理连接 (m ( m b) -> m b) 的方式思考一个 monad,让我们通过一个像验证这样的例子来加深我的理解:

in data Validation err a,函子结构为 (Validation err)。当您查看 Monad 的绑定定义并专门化验证类型时,您会得到以下结果:

(>>=)  :: m a -> (a -> m b) -> m b
(>>=)  :: (Validation err) a -> (  a -> (Validation err) b) -> (Validation err) b

如果你减少(>>=)你会得到:

m a -> (a -> m b) -> m b // if we apply (m a) in the monadic function  
m ( m b) -> m b

然后要获得 (>>=) 的结果,即 m b,您将使用 join :

join              :: (Monad m) => m (m a) -> m a
join x            =  x >>= id

如果你使用这些类型,你会得到:

join m ( m b ) = m ( m b) >>= (\(m b) -> m b -> m b) which gives m b

因此,该连接只是删除最外层的结构,只有最内层类型中的值(最内层函子的值)通过序列保留/传输。

在 monad 中,我们无法将一些信息从函子结构(例如验证错误)传递到下一个“动作”,我们唯一可以传递的就是值。您对该结构唯一可以做的就是使序列短路以从中获取信息。

您无法对函子结构中的信息执行一系列操作(例如累积错误之类的东西......)

所以我想说,一个用其结构上的某些逻辑来压缩其结构的应用程序可能会因为无法成为 Monad 而受到怀疑?


这并不是真正的答案,但对于评论来说太长了。

This以及该线程中其他引用的讨论都是相关的。我认为这个问题有点倒退:所有Monad自然地会产生Applicative (where pure = return, ETC);问题是大多数用户期望/假设(其中类型是实例Monad) the Applicative实例在语义上等同于 Monad 产生的实例.

这记录在Applicative阶级作为一种法律,但我并不完全相信它是合理的。争论似乎是,有一个Applicative and Monad不同意这种方式是令人困惑的。

我的使用经验Validation用它做任何大的事情都是一场噩梦,既因为符号变得一团糟,又因为你发现你有一些数据依赖性(例如,你需要根据前一节的解析来解析和验证一个节)。你最终定义bindV其行为就像Error monad >>=由于适当的Monad实例被认为是可疑的。

然而使用Monad/Applicative像这样配对可以满足您的需求:尤其是在使用时ApplicativeDo(我想;还没有尝试过这个),以 Monadic 风格编写解析器(例如)的效果是,根据解析代码的数据依赖性,您可以在每个级别累积尽可能多的错误。Haxl可以说以类似的方式捏造了这条“法律”。

我对其他类型没有足够的经验Applicative但不是Monad知道是否有一个合理的规则来规定应用语何时可以以这种方式表达不同意见。也许这完全是任意的Validation似乎工作很明智。

任何状况之下...

我不知道如何直接回答你的问题。我认为你首先要了解底部记录的法律Applicative类文档,然后翻转它们,这样你就得到:

 return = pure
 ap m1 m2 = m1 <*> m2

If ap是一种方法Monad上面是一个最小的完整定义,那么您只需测试上面是否通过了Monad法律来回答您的任何问题Applicative,但情况当然并非如此。

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

我们怎么知道应用程序不能是 Monad? 的相关文章

  • 为什么 GeneralizedNewtypeDeriving 没有安全的 Haskell?

    来自 GHC 手册 第安全语言 http www haskell org ghc docs 7 6 2 html users guide safe haskell html safe language 模块边界控制 使用安全语言编译的 Ha
  • 如何在 blaze-html 中渲染 blaze-svg 标记

    我想将使用 blaze svg 生成的 svg 图直接包含在使用 blaze html 生成的 html 中 两者都基于 blaze markup 所以我希望它很容易 diagram1 Svg diagram1 try1 Html try1
  • 如何将可选标志解析为 Maybe 值?

    我正在尝试使用optparse 应用程序 https hackage haskell org package optparse applicative 0 11 0 2解析一个Maybe String但我找不到任何地方如何处理Maybe 我
  • 算法 - 如何有效删除列表中的重复元素?

    有一个list L 它包含以下元素任意类型each 如何有效删除此类列表中的所有重复元素 必须保留订单 只需要一个算法 因此不允许导入任何外部库 相关问题 在Python中 从列表中删除重复项以使所有元素都是唯一的最快算法是什么在维持秩序的
  • 如何向 Scotty 中间件添加基本身份验证?

    我目前正在制作 Scotty API 但找不到任何 basicAuth 实现的示例 Wai Middleware HttpAuth 具体来说 我想将基本身份验证标头 用户 通行证 添加到我的某些端点 即以 admin 开头的端点 我已经设置
  • 如何在 Haskell 中枚举递归数据类型?

    这篇博文 http lukepalmer wordpress com 2008 05 02 enumerating a context free language 对于如何使用 Omega monad 对角枚举任意语法有一个有趣的解释 他提
  • Haskell 二进制解析

    我一直在尝试在 haskell 中实现一个协议解析器 而且我对这门语言还很陌生 特别是当涉及到 monad 时 我一直在使用binary 0 5 0 2 并描述了协议的标头和所有有效负载 我想要解析的消息如下所示 header payloa
  • 将 Either 列表转换为其中包含列表的 Either 列表

    我是 Haskell 的初学者 我正在编写一些使用 Haskell 的代码Either https hackage haskell org package base 4 9 0 0 docs Data Either html用于错误处理 E
  • 处理许多不相关的类型时避免样板

    我正在编写处理以下值的代码语言 扩展 注释 语法 http hackage haskell org packages archive haskell src exts 1 1 4 doc html Language Haskell Exts
  • Haskell 测量函数性能

    在 Haskell 中 我如何 简单地 测量函数的性能 例如 运行需要多长时间 或者需要多少内存 我知道分析 但是 是否有一种更简单的方法不需要我对代码进行太多更改 测量运行需要多长时间以及需要多少内存是两个独立的问题 即 基准测试和分析
  • 在 haskell 中处理 IO 与纯代码

    我正在编写一个shell脚本 我在haskell中的第一个非示例 它应该列出一个目录 获取每个文件大小 进行一些字符串操作 纯代码 然后重命名一些文件 我不确定我做错了什么 所以有两个问题 我应该如何安排这样的程序中的代码 我有一个具体问题
  • 存在函数依赖关系时类型推断如何工作

    考虑下面的代码 LANGUAGE MultiParamTypeClasses FlexibleInstances FunctionalDependencies UndecidableInstances FlexibleContexts cl
  • 使用 Haskell 将函数注入到 Java .class 文件中

    我使用 Haskell 编写了一个 Java 字节码解析器 它工作得很好 然而下一步让我完全难住了 我的 Haskell 程序需要修改 class 文件 以便在执行时 Java 程序打印 输入 此处的方法名称 在执行方法之前 并且 退出 此
  • 地图不是接受一个函数而列表返回一个列表吗?

    map2 List a gt b gt c gt a gt b gt c map2 List f map2 List f a as bs map f a bs map2 List f as bs 这是我的讲座中的一个示例 它尝试将二元函数应
  • 如何避免编写这种类型的 Haskell 样板代码

    我经常遇到这种情况 这很烦人 假设我有一个 sum 类型 它可以保存一个实例x或一堆其他无关的事情x data Foo x X x Y Int Z String other constructors not involving x 要声明
  • Haskell 中的多态函数作为参数

    我有一个带有两个构造函数的 ADT 一个包裹着一个Double和一个包裹着Integer 我想创建一个函数 它采用一元函数Numtypeclass 并返回一个函数 该函数将该一元函数应用于我的 ADT 的内容 我试过这个 data X Y
  • 是否有适用于 Haskell 或 Scala 等函数式语言的 LL 解析器生成器?

    我注意到明显缺乏用函数式语言创建解析器的 LL 解析器 我一直在寻找但没有成功的理想发现是为 ANTLR 风格的 LL 语法生成 Haskell 解析器 语法的模小数重新格式化 并且令我惊讶的是 每个最后一个解析器生成器都具有函数我发现的语
  • 数据类型变体之间的转换

    假设我想创建一种数据类型的两种变体 一种具有特定的构造函数 另一种没有它 否则它们是相同的 我想出了这个 LANGUAGE KindSignatures LANGUAGE DataKinds LANGUAGE GADTs data Foo
  • 有 Haskell 日期库吗?

    Haskell 中是否有一个函数允许我输入日期的组成部分 如字符串表示形式或日月年组成部分 我可以从中获取信息 如星期几 一个月中的天等 我在网上查了一下 看起来有很多自定义库 但我希望 ghci 10 6 4 的标准前奏库中有一个没有很好
  • 如何在 GHCJS 程序中定期执行操作?

    应该有人使用setInterval通过Javascript 或者使用一些更惯用的基于线程的解决方案 Using setInterval posed 一些挑战 https stackoverflow com questions 3357661

随机推荐