首页 > 解决方案 > 是否可以在不使用 Reader/Writer/State Monad 或 Monad Transformer 的情况下在 Haskell 中构建 Restful API

问题描述

作为一个初学者,我觉得 Reader/Write/State Monad 很难理解。而 Monad Transformers 更是难上加难。我看不到它们在其他语言中的用法,这让我有点难以将它们与我现有的 Web 开发经验联系起来。

是否可以在初学者友好的 Haskell 中构建一个与 Postgres 对话的 Restful API?意思是不使用像 Monads/Monad Transformers 这样的高级东西。

标签: haskell

解决方案


通常可以在不处理 monad 转换器或各种 monad(如 Reader、Writer 和 State)的情况下编写 Haskell 程序。你无法避免的一个单子是 IO。

例如,查看Warp文档中的示例代码:

app :: Application
app req respond = bracket_
    (putStrLn "Allocating scarce resource")
    (putStrLn "Cleaning up")
    $ respond $ responseStream status200 [] $ \write flush -> do
        write $ byteString "Hello\n"
        flush
        write $ byteString "World\n"

这一切都是由函数调用和 IO monad 组成的。你也可以自由地用这种风格编写代码……它的某些部分看起来与你用其他语言编写的相同代码非常相似。基本上,您编写一个带有两个参数的函数:一个是 HTTP 请求,另一个参数是您可以用来编写响应的东西。这与WSGI在 Python 中的工作方式或在 Go 中的net.http工作方式相同。

如果在某些时候您认为 monad 转换器很有用并且可以使您的代码更简单,那么您可以稍后再尝试。但无论如何,它们都不是必需的。


推荐阅读