2018-12-15 Xie Jingyi
一个依赖于外部状态 s 的伪函数 f' :: a -> b,我们可以将其改写为 f :: a -> s -> (b, s) 使其良定。即,在输入输出中显式传递状态 s。现在,我们需要利用 Monad 将状态传递过程隐藏起来。 注意到,输出值 (b, s) 中的末状态 s 不仅依赖于输入状态,更依赖于之前更改过状态的一系列函数及其逻辑。因此我们不能简单地将 Monad 定义为 (a, s) 类似的形式,否则两个函数用 >=> 结合的结果将与函数逻辑无关,这与我们的期望不符。 考虑如下定义: haskell newtype State s a = { runState :: s -> (a, s) } 由于 -> 的右结合性, 继续阅读 »
2018-12-14 Xie Jingyi
动机 pure functions 看似完美,但却不能模拟现实世界中的诸多任务。这是由于 pure functions 是良定的映射,对于特定的输入值会返回唯一的输出。这种模式在面对如下任务时会显得苍白无力: 有可能失败的任务。如大多数的 IO。 依赖外部状态的任务。如(伪)随机数生成器。 非确定性任务,即对于确定的输入可能有多个输出。这种在 IP 中较为少见。 对外界会造成影响的任务。如大多数的写入过程。 这些问题可以用数学中的域扩充技巧来解决。 域扩充 在数学中,当定义问题的范畴不足以容纳问题的解时,我们通常会对相关的范畴进行扩充。类似的技巧同样也可以应用在这里。 假设一个不良定的函数 f: A -> B: 如果 f 继续阅读 »
2018-03-30 MoreFreeze
Table of Contents {:toc} 最近遇到了一些函数式编程的概念,心想我用 Python 的 map reduce 不就是在函数式编程嘛, 但看了半天仍然一头雾水,什么是 UnitBox?flatMap 和 map 差在哪里?于是先学了阮老师的[函数式编程入门教程][1], 唉哟喂,和我原来想的还不一样,Python 这些操作虽然算是函数式编程,但要系统地理解为什么能这样, 还得从头说起。 继续阅读 »