Type Signature
of :: Applicative f => a -> f a
Law
v.ap(A.of(x => x)) === v
A.of(x).ap(A.of(f)) === A.of(f(x))
A.of(y).ap(u) === u.ap(A.of(f => f(y)))
Implement
Identity.of = x => Identity(x);
// Identity
Identity(1).ap(Identity.of(x => x)) === Identity(1);
// homomorphism
Identity.of(1).ap(Identity.of(add(1))) === Identity.of(add(1)(1))
// intercharge
Identity.of(1).ap(Identity.of(add(1))) === Identity(add(1)).ap(Identity(f => f(1)))
usage
想像一下在上一章 Apply 上提到的, 若一个 Monoid 是有 concat
method 功用是将值进行合并,并且有 empty
作为初始值,那 Applicative Functor 就是有 ap
method 将 Container 进行合并,并有 of
作为该Container 初始的值。
例如我们现在有一个函式 h
, 其 signature 为
h :: a -> f b -> f c
若要执行 h
函式,就需要先放入 a
跟 f b
,但很不巧的我们只有 b
此时 of
就非常有用,其将 b
包覆到其 Container。若现在有 of 这个 method 在 f
内,我们就可以透过 f.of(b)
转换成我们所需的第二个参数 f b
再举例来说,未来的章节里我们一个概念 Sequence
const append = y => xs => xs.concat([y]);
const mySequence = (A, xs) => xs.reduce((acc, val) => lift2(append)(val)(acc), A.of([]))
mySequence(Identity, [Identity(1), Identity(2), Identity(3)]) // Identity([1, 2, 3])
其可以将 Container 内的值收集到同组资料结构,像是 Map
, Array
... 等,而这有什麽用呢? 未来我们会介绍到专门处理非同步的 Task Monad,而此概念就可以发挥极大的效果
sequence(Task, [Task(getUserList), Task(getCategroy)]) // Task([[...users, ...categroy]])
到目前为止,我们还没有介绍如何将 Effect 与 Effect 进行 compose,而下一章我们将会介绍到它 Chain
f | g | composition |
---|---|---|
pure | pure | compose(f, g) |
effects | pure(unary) | f.map(g) |
effects | pure(n-ary) | f1.map(g).ap(f2) |
effects | effects | ? |
Chain
感谢大家阅读!
<<: 30天学会C语言: Day 16-你可能会用到的函式
Redis 资料型态Hash Hash是用来储存多组栏位值,可以是数字或字串.使用者可以对值进行操作...
Recap 前天提到, 建立一顶订单销售的流程大致可以分为 Customer enter Sales...
接着我们要说说 C String!C string 是字元阵列,通常会使用 pointer 来做应用...
昨天我们尝试动手刻了一个神经网路,准确度虽然看似很高了,但似乎还有进步的空间,今天我们就来介绍如何优...
今天的目标 要怎麽简单快速地做出客制化地文件?今天,我们会教用 GAS 搭配 Goolge Doc。...