Skip to content

zongwu's blog

Tag: #Haskell

WriterT 相关源码分析

看完ReaderT源码,接着来分析WriterT的源码。

示例

先看一个超级简单的例子:

import Control.Monad
import Control.Monad.Trans.Writer

data LogEntry = LogEntry { msg :: String } deriving (Eq, Show)

calc :: Writer [LogEntry] Integer calc = do tell [LogEntry "Start"] let x = sum [1 .. 10000000] tell [LogEntry (show x)] tell [LogEntry "done"] return x

test = execWriter calc test2 = runWriter calc

test执行结果:

[LogEntry {msg = "Start"},LogEntry {msg = "50000005000000"},LogEntry {msg = "done"}]

[翻译]ReaderT 设计模式

讲解工程实践中为什么需要 ReaderT 模式比较清晰的文章,就翻译了一下。原文见这里

在工程实践中,一些语言比如 Java 通过设计模式用来解决某些常见的场景问题。Haskell 语言没有这类设计模式,它通过语言层面的特性解决这些问题。 然而,我相信仍然有一些关于程序结构的高级指导的空间,我将其松散地称为 Haskell 设计模式。 这次描述的模式被称为 ReaderT 模式 。我将其用作 Yesod 框架 Handler 类型设计的基础。