我用Haskell编写了一个基本的CRUD应用程序,使用的是图书馆的仆人和Opaleye。
用于设置API端点的服务程序和将数据存储在DB中的Opaleye。
假设有一个端点GET /users,它返回DB中所有用户的列表,以及另一个端点POST /user,它创建一个新用户并将其保存在DB中。
程序首先启动到DB的连接,然后将这个连接作为参数传递给这些API端点函数(使用服务设置)作为参数。
有人建议我,更好的方法是使用Reader并将连接存储在环境中。
我能够做到这一点,但我不明白为什么Reader是共享环境的首选方式,而不是直接传递论点。
作为Haskell的初学者,我可以使用Monad,遵循教程并让我的程序运行,但我并不真正了解它们背后隐藏的美丽数学。这就是为什么,我想要避免使用monads (直到我完全理解monads背后的想法)。
这是我的代码,顺便说一下。
发布于 2018-06-15 16:48:23
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如果有一天fetch2和store2将参数从连接更改为其他(或更大的),您只需更新Handler类型别名,modify2就会保持不变。如果modify1在类型签名方面Connection是显式的,那么您也必须更改它。
关于使用Reader的另一个例子,我建议使用xmonad窗口管理器。XConfig数据类型存在于X monad的内部,但大多数时候,我不想知道它,更别提传递它了。
https://stackoverflow.com/questions/50878926
复制相似问题