我试图通过将类型定义与一些示例匹配起来,来处理Reader的应用实例。一个问题是,我不知道如何使用我的阅读器新类型。
我对读者的定义是
newtype R r a =
R { run :: r -> a }(<*>)的类型定义是
(<*>) :: Applicative f => f (a -> b) -> f a -> f b专门用于读取器类型,如下所示:
(<*>) :: (r -> a -> b) -> (r -> a) -> (r -> b)所以当我尝试:
(<*>) (+) (*2) 5 -- seems equivalent to using Reader since the types match在REPL中我得到了15。我想这是因为它计算(2*5) + 5。
我将如何处理我的阅读器新类型以上?你在(r -> a -> b)中看到的(r -> a -> b)是来自(r -> a)的相同的a,还是我误解了什么?
发布于 2016-05-31 20:26:02
正如我在注释中所说的,您基本上拥有所需的一切--缺少的部分只是从R构造函数包装/展开函数的技术问题。
下面是如何将R变成Applicative实例的方法:
instance Applicative (R r) where
pure a = R (\_ -> a)
(R f) <*> (R a) = R (\r -> (f r) (a r))是的这个:
(<*>) :: (r -> a -> b) -> (r -> a) -> (r -> b)然后翻译成:
(<*>) :: R r (a -> b) -> R r a -> R r b有了这个之后,与示例等价的调用只需要从构造函数包装/展开函数:
run (R (+) <*> R (*2)) 5如果您收到一些关于Functor实例的警告:您也需要这样做:
instance Functor (R r) where
fmap f (R a) = R (\r -> f (a r))https://stackoverflow.com/questions/37554450
复制相似问题