Day 15 - Contravariant Functor

在上一章,我们提到了 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 都要符合下列两种特性,

  • Identity: u.contramap(x => x) === u
  • Composition: 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)))

小结

今天太忙了,决定明天再进行补充!!! /images/emoticon/emoticon02.gif

NEXT: Functor & Contravariant Functor

Reference

  1. Contravariant

<<:  Stream Processing (2) - Chande Data Capture

>>:  本益比的误解

介绍Vertex(4) | ML#Day21

继训练好模型之後,这篇介绍「部署」和「预测」的使用。 Vertex提供非常无脑的一键部署方式,不需要...

【从实作学习ASP.NET Core】Day26 | 前台 | PayPal 订单付款 (1)

接续昨天提到的 PayPal Checkout ,今天要试着把 PayPal 付款按钮加到页面上 P...

Vue.js 从零开始:准备

前言 为了能更了解Vue的运作与观念,刚好藉由这次的铁人赛,从零开始学习,目标是写出能让刚开始接触的...

Day 28 - [实战练习] iOS 15 介面

随着 iPhone 13 发表後,前几天 ios 15 已推出正式版,之前威尔猪的 2 篇实战都是...

Day 20 ATT&CK for ICS - Evasion(2)

T0858 Change Operating Mode 如同Day15 ATT&CK for...