【发布时间】:2019-11-23 03:45:59
【问题描述】:
我是 Haskell 初学者,我必须解决一个工作表问题,这一次我真的被困住了。救命!:))
我必须从函子到 monad 开始计算某些 monad 的实例,但我无法弄清楚 Applicative 实例中的纯。我不想发布程序的所有代码,但我认为以下内容应该能说明问题:
这是给定的代码,不能更改:
class (Semigroup a, Monoid a) => Log a where
logMsg :: String -> a
newtype Logger l a = Logger (a,l)
deriving Show
logMsgM :: Log l => String -> Logger l ()
logMsgM s = Logger ((), logMsg s)
这些是我正在处理的实例:
instance (Log l) => Functor (Logger l) where
fmap g (Logger (a, l)) = Logger ((g a), l)
instance (Log l) => Applicative (Logger l) where
pure ???????????????????
(<*>) (Logger (g,l)) (Logger (a,_)) = Logger ((g a), l)
instance (Log l) => Monad (Logger l) where
return = pure
(>>=) (Logger (a,l)) g = (g a)
(>>) x y = x >>= \_ -> y
我被纯粹的卡住了。 pure = Logger 产生无限类型错误 a ~ (a,l) 并且所有使用输入参数进行调整的尝试最终都会导致未知变量错误,或者带有尾随零的类型变量的奇怪类型错误等。我尝试了很多,很难以更明智的方式发布错误消息。 我不明白发生了什么事。这是基于介绍讲座,所以我知道基本概念。我只是不能用函数声明正确处理这个新类型定义(我认为......),特别是这个将两个参数包含为一个(对)。我确实理解(或者更好的措辞:“我可以遵循”)类型定义或新类型中的典型示例,例如 may 、 either 或其他在右侧具有相同数量或更多参数的示例。但是,也许,我对这个假设有误,而且我在我根本看不到的地方犯了一个谬误。
顺便说一句,写pure = return时整个代码编译,但程序产生堆栈溢出(微笑)。我认为这并不奇怪,因为 return = puer 和 pure = return 可以很好地编译但没有意义,对吧!?
感谢帮助:)
【问题讨论】:
标签: haskell applicative