gpt4 book ai didi

haskell - 无需类型构造函数即可满足 monad 法则

转载 作者:行者123 更新时间:2023-12-02 21:14:32 31 4
gpt4 key购买 nike

给定例如像

这样的类型
data Tree a = Branch (Tree a) (Tree a)
| Leaf a

我可以轻松地为 Functor、Applicative、Monad 等编写实例。

但是如果“包含”类型是预先确定的,例如

data StringTree = Branch StringTree StringTree
| Leaf String

我失去了编写这些实例的能力。

如果我为 StringTree 类型编写函数

stringTreeReturn :: String -> StringTree
stringTreeBind :: String -> (String -> StringTree) -> StringTree
stringTreeFail :: String -> StringTree
-- etc.

满足了 monad 法则,我还能说 StringTree 是一个 monad 吗?

最佳答案

Tree a不是一个单子(monad),无论是一般还是对于任何特定的 a , Tree 本身是一个单子(monad)。单子(monad)不是类型,它是任何类型和该类型的“单子(monad)版本”之间的对应关系。例如,Integer是整数类型,Maybe IntegerMaybe 中整数的类型单子(monad)。

因此,StringTree ,它是一种类型,不能是单子(monad)。这根本就不是同一种东西。您可以尝试将其想象为 monad 中的字符串类型,但是您的函数 stringTreeReturn等,与它们的单子(monad)对应者的类型不匹配。看>>=的类型在 Maybe单子(monad):

Maybe a -> (a -> Maybe b) -> Maybe b

第二个参数是来自某个 a 的函数到 Maybe 中的任何类型单子(monad)(Maybe b)。 stringTreeBind具有类型:

String -> (String -> StringTree) -> StringTree

第二个参数只能是 String 中的函数到 String 的一元版本,而不是任何类型的一元版本。

因此,您无法对任意一元类型中的值执行所有可以执行的操作 StringTree值,这就是它不能成为实例的原因。即使您可以以某种方式将其视为 monad,当通用 Monadic 代码期望能够以对 StringTree 没有意义的方式使用通用 Monadic 操作时,事情就会开始出错。 .

最终,如果你认为它“像”一个单子(monad),因为它是 String在行为类似于单子(monad)容器的容器中,最简单的事情就是将其设为任何类型的通用容器( Tree a )。如果您需要具有专门依赖于字符串树的辅助功能,那么您可以将该代码编写为仅在 Tree String 上运行。值,并且它会很高兴与一般在 Tree a 上运行的代码共存。 .

关于haskell - 无需类型构造函数即可满足 monad 法则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12073336/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com