【发布时间】:2020-11-28 09:22:12
【问题描述】:
我正在尝试为 RWS 的 Applicative 和 Monad 定义实例,但一定有一些我遗漏的东西。对于pure,我收到一个发生检查错误。尽管 f 的类型为 a,但它一定与我将 RWS f 作为 pure 的结果给出的事实有关。我不明白如何访问RWS(r、w 和 s)的其他参数。如果有人详细解释一些概念,例如newtype 定义,我将不胜感激。据我了解,我们定义了一个新类型RWS,它有 4 个参数(r、w、s 和 a)。这种类型是使用构造函数 (fromRWS) 定义的,它对参数执行一些操作。如果我错了,请纠正我。如果这是正确的,RWS 是由 4 个参数定义的还是由 fromRWS 定义的?
进一步,<*> 的实现会产生类型错误。它说 fromRWS2 应用于太少的参数。不过,我没有看到这个问题,因为我使用了相同的 where 子句方法来解决变量环境的类似问题。我可以使用哪些替代品?
定义Monad时,我只得到了parse error on input RWS
请帮我定义实例。
这是我的代码:
module RWS where
newtype RWS r w s a = RWS { fromRWS :: r -> s -> (a, s, w) }
instance Functor (RWS r w s) where
fmap f (RWS rws) = RWS $ \r s -> let (a,s',w) = rws r s in (f a, s', w)
instance Monoid w => Applicative (RWS r w s) where
-- pure a -> RWS r w s a
pure f = RWS f
-- (<*>) :: RWS r w s (a -> b) -> RWS r w s a -> RWS r w s b
RWS f <*> RWS a = RWS fromRWS2
where fromRWS2 r1 s1 = f a
instance Monoid w => Monad (RWS r w s) where
--return :: a -> RWS r w s a
return x = RWS x
--(>>=) :: (RWS r w s a) -> (a -> (RWS r w s b)) -> (RWS r w s b)
RWS fr >>= f = f fr
【问题讨论】:
标签: haskell monads record applicative