我们怎么知道应用程序不能是 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? 的相关文章

  • Data.Array 有多快?

    The 文档 http haskell org ghc docs latest html libraries array 0 3 0 3 Data Array html of Data Array reads Haskell 提供了可索引数
  • 如何在 Haskell 中使 CAF 不是 CAF?

    如何将常量应用形式变成 而不是常量应用形式 以阻止它在程序的生命周期中保留 我尝试过这种方法 Dummy parameter to avoid creating a CAF twoTrues gt Bool twoTrues map Tru
  • Haskell Fibonacci 达到最大指定数?

    我有一个已启动并正在运行的 Haskell 函数 但它做错了事情 它应该输出最多指定最大数量的斐波那契数列 像这样 fibonacciSequence 86 1 1 2 3 5 8 13 21 33 54 我的代码当前输出斐波那契数列中的前
  • 如何让 esqueleto 为我生成 SQL 字符串?

    我怎样才能让esqueleto从a生成一个SQL字符串from陈述 的文档toRawSql说 你可以打开持久的查询日志记录 我尝试了所有可能的形式MonadLogger我可以理解 但它从未打印任何 SQL 同一文档还说 手动使用此功能 是可
  • 优化 Haskell 内循环

    仍在 Haskell 中进行 SHA1 实现 我现在已经有了一个有效的实现 这是内部循环 iterateBlock Int gt Word32 gt Word32 gt Word32 gt Word32 gt Word32 gt Word3
  • Haskell 为替代的 Either 数据类型定义 Functor 实例

    通过 Typeclassopedia 获得一些使用类型类的路由 想要替代Either的一个实例Functor 但即使检查定义Either作为一个例子Functor总是给我带来麻烦 有这个 但不会编译 data Alt a b Success
  • 来自数据类型的 Haskell 随机数

    我对 Haskell 还很陌生 我有一个数据类型 data Sentence Prop Int No Sentence And Sentence Or Sentence deriving Eq 我已经为它写了一个 Show 实例 然而 无论
  • Haskell 中的内部爆炸模式是否总是强制使用外部构造函数?

    在 Haskell 中 是否存在对于数据类型 LANGUAGE BangPatterns import Control DeepSeq data D D Int 实例 instance NFData D where rnf D 与具有另一个
  • 为什么 GHC 在这里推断出单态类型,即使禁用了单态限制?

    这是由解析 f f pure 的类型 https stackoverflow com questions 55388119 resolving the type of f f pure 55388309 noredirect 1 comme
  • Haskell/Idris 中的开放类型级别证明

    在 Idris Haskell 中 可以通过注释类型并使用 GADT 构造函数 例如使用 Vect 来证明数据的属性 但这需要将属性硬编码到类型中 例如 Vect 必须是与 List 不同的类型 是否有可能拥有具有开放属性集的类型 例如同时
  • HASKELL:解决河内塔

    下面的代码解决了 hanoi 使用预定义函数 moveLOD swapLOI 和 swapLID 返回移动列表的问题 MoveLOD 将 1 个圆盘从第一个位置移动到三元组第三个位置中的第三个销钉 此外 包含有关运动信息的字符串会堆积在字符
  • Haskell:确定函数数量的函数?

    可以写一个函数吗arity a gt Integer确定任意函数的数量 使得 gt arity map 2 gt arity foldr 3 gt arity id 1 gt arity hello 0 是的 这可以非常非常容易地完成 ar
  • 告诉阴谋集团主模块在哪里

    我有一个具有以下结构的项目 foo cabal src Foo Main hs foo cabal 的一部分如下所示 executable foo main is Foo Main hs hs source dirs src Main hs
  • 不理解 Monoid 定义中态射的表示法

    我试图理解什么Monoid是从范畴论的角度来看的 但我对用来描述它的符号有点困惑 这是维基百科 在范畴论中 幺半群范畴 C I 中的幺半群 或幺半群对象 M 是一个对象 M 和两个态射 M M M 称为乘法 I M 称为单位 我的困惑在于态
  • 在不同上下文中使用的多态变量 haskell

    我有以下一段 Haskell 代码 foo Num a gt a gt a gt Either Integer Double gt Either Integer Double foo f x case x of Left i gt Left
  • parList 和 parBuffer 如何选择?

    我从 haskell 并行开始 我已经成功学习了如何使用一些策略 例如 r0 rseq rdeepseq parList parMap 现在我正在进一步寻求更高的效率 所以这是我的问题 有什么区别parList and parBuffer
  • 如何获得具有超载字段名称的经典镜头?

    我正在尝试为具有相同字段名称的记录构建镜头 除此之外 我试图 包装 扩展 这些基本记录 并希望相同的字段名称适用于包装 扩展的记录 我相信 优雅的镜头就是这样做的 我如何让以下内容发挥作用 Data types for context of
  • 我可以在线性时间内检查有界列表是否包含重复项吗?

    假设我有一个Int列表 其中元素已知是有界的 并且列表已知不长于它们的范围 因此它完全有可能不包含重复项 如何才能最快地测试是否是这种情况 我知道nubOrd https hackage haskell org package contai
  • 在 GHCi 中,为什么我不能在 REPL 中显示 `pure 1`?

    我尝试将提升值分配给a gt m Control Applicative gt let a pure 1 当我评价的时候a在 REPL 中 它打印1 gt a 1 因此 我认为可能会实施show for a 并尝试了这个 gt show a
  • 模式匹配中的 Monoid mempty

    我尝试写一个通用的maximum功能类似于Prelude 我的第一个天真的方法如下所示 maximum F Foldable a Ord b gt a b gt Maybe b maximum mempty Nothing maximum

随机推荐