《函数式编程精粹》(2) 热身:A STACK BASED CALCULATOR
热身:A STACK BASED CALCULATOR
https://swlaschin.gitbooks.io/fsharpforfunandprofit/content/posts/stack-based-calculator.html
先定义类型
复制代码
实现 stack
复制代码
One
one 是一个指令,one 是什么类型?
复制代码
or
复制代码
实现:
复制代码
复制代码
复制代码
test one two three
复制代码
add/面向组合的设计
提问:add 是什么类型?
复制代码
这样设计就是面向组合的设计。
复制代码
compose
h(f(g(X))) ===> 这样的写法其实是 operational 的写法,我们需要一个 compose 的操作,把 h,f,g 组合起来
复制代码
改写原来的使用
复制代码
延迟执行
compose 的方法还有另一个区别,compose 之后的结果可以不马上传入参数执行,而是延迟执行。而之前的方法必须立即执行。
代数系统的映射
以上内容对于理解 Monad 的概念很有帮助。如果一个问题能跟代数映射的话,那威力就相当大了。
去重复
假设将来实现了乘法,MUL,那么就会发现和 ADD 加法很类似。在函数式编程里面,最直接的解决方案就是把计算过程参数化,抽象出运算符的类型。当然面向对象有面向对象的解决方法。
复制代码
复制代码
这就是 High Order Function.
OO VS FP
很简单,更抽象,但是不好理解。
评论