gpt4 book ai didi

haskell - 使用绑定(bind)在 haskell 中调用自定义 monad

转载 作者:行者123 更新时间:2023-12-02 15:47:13 25 4
gpt4 key购买 nike

我目前正在“接触 monads”(http://learnyouahaskell.com/a-fistful-of-monads#getting-our-feet-wet-with-maybe)并且仍在为这个概念的一部分而苦苦挣扎。我理解那里提到的 maybe monad 并且可以看到如何调用它,如下所述:

ghci> return "WHAT" :: Maybe String  
Just "WHAT"
ghci> Just 9 >>= \x -> return (x*10)
Just 90
ghci> Nothing >>= \x -> return (x*10)
Nothing

如果我用自己的类型声明自己的实例,那么我如何调用自己的 monad 实例而不是 maybe 实例,如下所示:

newtype CustomM a = CustomM {runCustomM:: a -> String}


instance Monad CustomM where
return a = CustomM (\a -> mempty)
m >>= f = CustomM (\a -> mempty)


instance Functor CustomM where
fmap = liftM
instance Applicative CustomM where
pure = return; (<*>) = ap

使用 return 只会调用 Maybe Monad 我怀疑。 >>= 需要我给它一个特定的类型。

注意。我只是以与返回相同的方式进行绑定(bind),因为我仍然在努力理解它应该返回什么,以及如何给它一个 monad m 并在它的值上调用函数 f a,当我没有在左侧更彻底地指定打包类型时。但我会就此发表另一篇文章。

最佳答案

您可以像使用 Maybe 一样创建您的 CustomM 类型的值,使用 return:

cm = return "WHAT" :: CustomM String

你也可以在时尚之后运行它:

Prelude Control.Monad> runCustomM cm "foo"
""

显然,由于您已将其硬编码为返回 mempty,因此它返回 Stringmempty 值,即“”

尽管如此,a -> Stringcontravarianta 中,所以它不是有用的 Functor 实例。因为它不是一个有用的 Functor 实例,所以它也不是一个有用的 Monad 实例。

虽然您可以像在 OP 中那样定义一个退化的实现,但您不会成功地让 CustomM 真正做任何事情。

请尝试交换类型,例如字符串 -> a

关于haskell - 使用绑定(bind)在 haskell 中调用自定义 monad,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73727177/

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