[Functional Programming] Arrow Functor with contramap
Posted answer1215
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[Functional Programming] Arrow Functor with contramap相关的知识,希望对你有一定的参考价值。
What is Arrow Functor?
Arrow
is aProfunctor
that lifts a function of typea -> b
and allows for lazy execution of the function.Arrow
can be considered aStrong Profunctor
if the underlying data running through theArrow
is aPair
, typically in the form ofArrow (Pair a c) (Pair b d)
.This will allow you to split execution into two distinct paths, applying
Arrow
to a specific path. The parameters ofArrow
represent the function that it wraps, with the input being on the left, and the output on the right. When anArrow
wraps an endomorphism, the signature typically represents both the input and output.
In short, Arrow is
- Take a function
- Function will be lazy
- We can apply params later
const Arrow = require(‘crocks/Arrow‘); const arrUpper = Arrow( str => str.toUpperCase() ) log( arrUpper.runWith(‘zhentian‘) ) // ZHENTIAN
Why this can be useful?
In this post, we are going to see an exmple about how to use ‘Arrow‘ with ‘contramap‘:
Currently ‘arrUpper‘ take a string as input, sometimes the data we receive might be is an Object:
// {name: ‘zhentian‘}
In this case, we cannot directly using ‘arrUpper‘, and we don‘t want to modify our ‘arrUpper‘ function to be:
const arrUpper = Arrow(o => o.name && o.name.toUpperCase())
What we can do is using ‘contramap‘ to apply an function on the input param of ‘arrUpper‘, to change the Object type to String type, we can keep the ‘arrUpper‘ untouched:
const Arrow = require(‘crocks/Arrow‘); const chain = require(‘crocks/pointfree/chain‘); const option = require(‘crocks/pointfree/option‘); const prop = require(‘crocks/Maybe/prop‘); const safe = require(‘crocks/Maybe/safe‘); const getName = compose( option(‘no name‘), chain(safe(isString)), prop(‘name‘) ) const arrUpper = Arrow( str => str.toUpperCase() ) const nameUpper = arrUpper .contramap(getName) log( nameUpper.runWith({name: ‘zhentian‘}) ) // ZHENTIAN
What ‘contramap‘ does is apply the given function (getName) to the target function (arrUpper)‘s params ({name: ‘zhentian‘}), before the target function get invoked.
So in our example, we transform the {name: ‘zhentian‘} to just ‘zhentian‘ or ‘no name‘ before passing to arrUpper.
以上是关于[Functional Programming] Arrow Functor with contramap的主要内容,如果未能解决你的问题,请参考以下文章
[Functional Programming ADT] Debug a Functional JavaScript composeK Flow