在上一章,我们提到了 Functor,但更精准地说是 Covariant functor,而今天要提到的则是 Contravariant Functor,其定义非常相似
contramap :: Contravariant f => f a ~> (b -> a) -> f b
map :: Functor f => f a ~> (a -> b) -> f b
Type Signature
contramap :: Contravariant f => f a ~> (b -> a) -> f b
Law
对於任何 Contravariant u
都要符合下列两种特性,
u.contramap(x => x) === u
u.contramap(f).contramap(g) === u.contramap(x => g(f(x)))
Example
来看看一个简单的范例,首先我们先来建立一个 Contravariant Functors Pred
import * as R from 'ramda';
// contramap :: Pred a ~> (b -> a) -> Pred b
const Pred = run => ({
run,
contramap: g => Pred(R.compose(run, g))
})
// Pred Number
const isEven = Pred(num => num % 2 === 0)
const length = x => x.length
const lengthIsEven = isEven.contramap(length)
lengthIsEven.run('FP') // true
可以看到 lengthIsEven
就是先将 字串 FP
透过 length :: String -> Number
转换後,就将原本的 Pred Number
转换成 Pred String
验证是否符合 fantasy-land 的定义
const exclaim = str => str.concat('!')
// Identity
Pred(isEven).contramap(x => x) === Pred(isEven)
// Composition
Pred(isEven).contramap(length).contramap(exclaim) === Pred(isEven).contramap(x => length(exclaim(x)))
今天太忙了,决定明天再进行补充!!!
NEXT: Functor & Contravariant Functor
<<: Stream Processing (2) - Chande Data Capture
继训练好模型之後,这篇介绍「部署」和「预测」的使用。 Vertex提供非常无脑的一键部署方式,不需要...
接续昨天提到的 PayPal Checkout ,今天要试着把 PayPal 付款按钮加到页面上 P...
前言 为了能更了解Vue的运作与观念,刚好藉由这次的铁人赛,从零开始学习,目标是写出能让刚开始接触的...
随着 iPhone 13 发表後,前几天 ios 15 已推出正式版,之前威尔猪的 2 篇实战都是...
T0858 Change Operating Mode 如同Day15 ATT&CK for...