15 Sep 2022

双因素认证(2FA)与HOTP/TOTP

名词定义 HOTP: HMAC-based One-Time Password TOTP: 基于时间的一次性密码算法(Time-based One-Time Password) 2FA: 双因素认证(Two-Factor Authentic...
06 Sep 2022

函数式编程在前端的应用:Elm和re-frame

Elm Elm启发了Redux和Vuex,在github上有专门的 elm-architecture 主题。 Elm本身是一个函数式编程语言,同时也是一个Web框架。整个Web框架的核心数据流,类似于一个reduce函数:当前状态 ->...
05 Sep 2022

范畴论基础(10) - Kleisli Arrow

一个返回容器类的函数,签名是 f :: a -> m b,这里的类型 m,如果是个 Monad,那这个函数可以被称为 monadic function。 如果再来一个 monadic function,签名是 g :: b ->...
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...
29 Jul 2022

范畴论基础(7) - 基于Haskell重写例子

Haskell简介 Haskell (/ˈhæskəl/) is a general-purpose, statically-typed, purely functional programming language with type i...