zoukankan      html  css  js  c++  java
  • [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!")
  • 相关阅读:
    sourceinsight安装记录
    ultraedit使用记录
    Java中OutOfMemoryError(内存溢出)的三种情况及解决办法
    applicationContext.xml
    添加lib,支持断点运行,支持自动打包,支持 中文。
    使用Supervisor来管理你的Laravel队列
    laravel使用队列
    debian php无法使用bc函数 bcmath
    gti代码冲突解决
    debian 安装mysql后远程访问不了
  • 原文地址:https://www.cnblogs.com/Answer1215/p/5851666.html
Copyright © 2011-2022 走看看