首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >与直接将环境作为参数传递相比,更喜欢Reader

与直接将环境作为参数传递相比,更喜欢Reader
EN

Stack Overflow用户
提问于 2018-06-15 15:46:22
回答 1查看 472关注 0票数 3

我用Haskell编写了一个基本的CRUD应用程序,使用的是图书馆的仆人和Opaleye。

用于设置API端点的服务程序和将数据存储在DB中的Opaleye。

假设有一个端点GET /users,它返回DB中所有用户的列表,以及另一个端点POST /user,它创建一个新用户并将其保存在DB中。

程序首先启动到DB的连接,然后将这个连接作为参数传递给这些API端点函数(使用服务设置)作为参数。

有人建议我,更好的方法是使用Reader并将连接存储在环境中。

我能够做到这一点,但我不明白为什么Reader是共享环境的首选方式,而不是直接传递论点。

作为Haskell的初学者,我可以使用Monad,遵循教程并让我的程序运行,但我并不真正了解它们背后隐藏的美丽数学。这就是为什么,我想要避免使用monads (直到我完全理解monads背后的想法)。

这是我的代码,顺便说一下。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-15 16:48:23

  1. Monad只是更方便,当您希望将参数传递到调用堆栈的几个层次时。
  2. Monad读取器方便代码更改/扩展。假设您想从数据库中获取一些Foo类型的值,对其进行更新(以不纯的方式)并将其存储回去。这里有两个版本,带有Reader和显式参数传递。 数据Foo = ..。modifyFoo ::Foo -> IO Foo type Handler a= fetch1 ::Connection -> Int -> IO Foo fetch2 ::Int -> Handler Foo store1 : Connection -> Foo -> IO () store2 ::Foo -> Handler () modify1 ::Connection -> Int -> IO () modify1 conn key = do prev <- fetch1 conn key new & Int;--修改prev -> conn键::Int Handler () en23 20# key = do prev <- key新<-修改prevmodify2‘::Int -> Handler () modify2’= fetch2 >=> liftIO。修改>=> store2

如果有一天fetch2store2将参数从连接更改为其他(或更大的),您只需更新Handler类型别名,modify2就会保持不变。如果modify1在类型签名方面Connection是显式的,那么您也必须更改它。

关于使用Reader的另一个例子,我建议使用xmonad窗口管理器。XConfig数据类型存在于X monad的内部,但大多数时候,我不想知道它,更别提传递它了。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50878926

复制
相关文章

相似问题

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