gpt4 book ai didi

purescript - Purescript 中的 Reader Monad

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

我在 Purescript 中使用 Reader monad 时遇到了一个奇怪的行为。我不知道是因为我对这个 monad 缺乏理解,还是我遗漏了其他东西。

这是我的代码:

type Level = Number
type Doc = Reader Level String

renderLine :: String -> Level -> String
renderLine s 0 = s
renderLine s l = "\t" ++ (renderLine s (l - 1))

line :: String -> Doc
line s = do
level <- ask
return (renderLine s level)

这没问题,可以编译。不过,在此之前,我在我的函数行中尝试了一些更简单的方法:

line :: String -> Doc
line s = do
level <- ask
return "Hello Reader monad"

并且它不会编译,尽管事实上 (renderLine s level) 和“Hello Reader monad”具有相同的类型。它会抛出这个错误:“找不到 Control.Monad.Reader.Class.MonadReader u14555 (Control.Monad.Reader.Trans.ReaderT Prim.Number Control.Monad.Identity.Identity) 的实例”

我确定我错过了什么,但我不知道是什么。

最佳答案

该错误的更具可读性的版本是:

No instance found for MonadReader ? (Reader Number)

我认为这里的问题是由于 PureScript 中缺少函数依赖 - 在 Haskell 中 MonadReader类定义为 MonadReader r m | m -> r所以rm 决定,但我们不能在 PureScript 中这样做。

我怀疑它在前一种情况下而不是在后者中起作用的原因是 level 的类型与 Level 统一在调用 renderLine , 这意味着 r因此也必须是 Level .

因为您没有对 level 做任何事情|在后一种情况下,类型变量未统一,这就是错误的来源,因为在 r 时确实没有 MonadReader 的实例。未知。

关于purescript - Purescript 中的 Reader Monad,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29096869/

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