Day 17 - Applicative

Introduction

Type Signature

of :: Applicative f => a -> f a

Law

  • Identity: v.ap(A.of(x => x)) === v
  • homomorphism: A.of(x).ap(A.of(f)) === A.of(f(x))
  • intercharge: 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 函式,就需要先放入 af 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

感谢大家阅读!

Reference

  1. Applicative

<<:  30天学会C语言: Day 16-你可能会用到的函式

>>:  30天学会 Python: Day 16-图片处理

Day14 Redis应用实战-Hash操作

Redis 资料型态Hash Hash是用来储存多组栏位值,可以是数字或字串.使用者可以对值进行操作...

NetSuite Order to Cash flow - Fulfill Sales Order

Recap 前天提到, 建立一顶订单销售的流程大致可以分为 Customer enter Sales...

【Day 25】C String

接着我们要说说 C String!C string 是字元阵列,通常会使用 pointer 来做应用...

DAY23 神经网路优化技巧

昨天我们尝试动手刻了一个神经网路,准确度虽然看似很高了,但似乎还有进步的空间,今天我们就来介绍如何优...

D18 - 如何用 Apps Script 自动化地创造与客制 Google Docs?(五)Element 的更新

今天的目标 要怎麽简单快速地做出客制化地文件?今天,我们会教用 GAS 搭配 Goolge Doc。...