首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用我的读取器: newtype r=R{ run ::r -> a }?

如何使用我的读取器: newtype r=R{ run ::r -> a }?
EN

Stack Overflow用户
提问于 2016-05-31 19:49:32
回答 1查看 114关注 0票数 1

我试图通过将类型定义与一些示例匹配起来,来处理Reader的应用实例。一个问题是,我不知道如何使用我的阅读器新类型。

我对读者的定义是

代码语言:javascript
复制
newtype R r a =
  R { run :: r -> a }

(<*>)的类型定义是

代码语言:javascript
复制
(<*>) :: Applicative f => f (a -> b) -> f a -> f b

专门用于读取器类型,如下所示:

代码语言:javascript
复制
(<*>) :: (r -> a -> b) -> (r -> a) -> (r -> b)

所以当我尝试:

代码语言:javascript
复制
(<*>) (+) (*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,还是我误解了什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-05-31 20:26:02

正如我在注释中所说的,您基本上拥有所需的一切--缺少的部分只是从R构造函数包装/展开函数的技术问题。

下面是如何将R变成Applicative实例的方法:

代码语言:javascript
复制
instance Applicative (R r) where
    pure a          = R (\_ -> a)
    (R f) <*> (R a) = R (\r -> (f r) (a r))

是的这个:

代码语言:javascript
复制
(<*>) :: (r -> a -> b) -> (r -> a) -> (r -> b)

然后翻译成:

代码语言:javascript
复制
(<*>) :: R r (a -> b) -> R r a -> R r b

有了这个之后,与示例等价的调用只需要从构造函数包装/展开函数:

代码语言:javascript
复制
run (R (+) <*> R (*2)) 5

如果您收到一些关于Functor实例的警告:您也需要这样做:

代码语言:javascript
复制
instance Functor (R r) where
    fmap f (R a) = R (\r -> f (a r))
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37554450

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档