31 Aug 2022

ClojureScript中的goog.DEBUG

goog.DEBUG 谁来设置? shadow-cljs会自动设置,参考这里 ^boolean 是什么 re-frame的template中会自动生成一个变量,其中使用了 ^boolean 这个type hint (def debug? ^...
29 Aug 2022

Reduce与Transducer

reduce/foldl/foldr reduce是函数式编程中用于处理列表(数组、序列等可迭代数据结构)一个最重要的函数,haskell中是foldl和foldr。其中foldl与reduce含义相同,是从列表的最左面一个元素开始执行,f...
26 Aug 2022

函数式编程的一些内在逻辑

函数式编程想解决什么问题 函数式编程想消除程序的复杂性。 在 Out of the Tar Pit 一文中指出,程序的复杂性的最主要来源是状态管理,以及状态管理带来的分析与理解负担。 举例来说,维护一个大型的系统中的函数,如果某个函数读取或...
18 Aug 2022

Haskell中foldl与foldr的区别

大部分其它语言中的reduce,都是从最左面的元素开始迭代的,相当于foldl foldr是lazy的,可以用于无限的流式数据 foldr支持短路运算,foldl不支持,以下代码可以正确返回False,如果是foldl就会死循环 fold...
11 Aug 2022

范畴论基础(9) - Writer Monad

提出问题 假设有一个half函数 half x = x `div` 2 这时候要连续执行两次就很容易,可以compose quarter = half . half 如果函数除了要除2,还要写一条日志,那怎么办? 不能在函数内直接写文件或控...
09 Aug 2022

范畴论基础(8) - Reader Monad

提出问题 假设有这样一个数据类型,用于存储一个应用的配置信息 data Config = Config { selectFirst :: Bool, greet :: String } 有两个函数都依赖这个配置 -- selectUserT...