[Javascript] Either Functor

Posted Answer1215

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[Javascript] Either Functor相关的知识,希望对你有一定的参考价值。

Either Functor:

// API

Right(val) // resolve the value

Left(val) // return error message

 

Examples:

map(function(x) { return x + 1; }, Right(2))
//=> Right(3)

map(function(x) { return x + 1; }, Left(‘some message))
//=> Left(‘some message’)
var determineAge = function(user){
  return user.age ? Right(user.age) : Left("couldn’t get age");
}
var yearOlder = compose(map(add(1)), determineAge)

yearOlder({age: 22})
//=> Right(23)

yearOlder({age: null})
//=> Left("couldn’t get age")

 

var _ = R;
var P = PointFree;
var map = P.fmap;
var compose = P.compose;
var Maybe = P.Maybe;
var Identity = P.Id;

var Either = folktale.data.Either;
var Left = Either.Left;
var Right = Either.Right;


// Exercise 1
// ==========
// Write a function that uses checkActive() and showWelcome() to grant access or return the error
console.log("--------Start exercise 1--------")

var showWelcome = compose(_.add( "Welcome "), _.get(name))

var checkActive = function(user) {
 return user.active ? Right(user) : Left(Your account is not active)
}

var ex1 = compose(map(showWelcome), checkActive);

assertDeepEqual(Left(Your account is not active), ex1({active: false, name: Gary}))
assertDeepEqual(Right(Welcome Theresa), ex1({active: true, name: Theresa}))
console.log("exercise 1...ok!")



// Exercise 2
// ==========
// Write a validation function that checks for a length > 3. It should return Right(x) if it is greater than 3 and Left("You need > 3") otherwise
console.log("--------Start exercise 2--------")

var ex2 = function(x) {
  if(x){
    return x.length > 3 ? 
        Right(x) : 
        Left("You need > 3");
  }else{
    return Left("You need > 3");
  }
}


assertDeepEqual(Right("fpguy99"), ex2("fpguy99"))
assertDeepEqual(Left("You need > 3"), ex2("..."))
console.log("exercise 2...ok!")





// Exercise 3
// ==========
// Use ex2 above and Either as a functor to save the user if they are valid

var save = function(x){ console.log("SAVED USER!"); return x; }

var ex3 = compose( map(save), ex2)

console.log("--------Start exercise 3--------")
assertDeepEqual(Right("fpguy99"), ex3("fpguy99"))
assertDeepEqual(Left("You need > 3"), ex3("duh"))
console.log("exercise 3...ok!")

 

以上是关于[Javascript] Either Functor的主要内容,如果未能解决你的问题,请参考以下文章

将 Iterable[Either[A,B]] 减少为 Either[A, Iterable[B]]

如何绑定多个Either<,>?

如何将 Seq[Either[A,B]] 减少为 Either[A,Seq[B]]?

Dartz - 离开 Either

Arrow-kt:如何将 Either<E, List<Either<E,A>>> 变成 Either<E, List<B>>

LangageExt:使用 Bind() 链接两个 Either,但无法弄清楚如何使用它们创建另一个 Either