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!")
  • 相关阅读:
    对面向对象设计原则的总结
    sql server连接字符串
    js页面加载进度条
    Yui.Compressor高性能ASP.NET开发:自动压缩CSS、JS
    asp.net利用多线程执行长时间的任务,客户端显示出任务的执行进度的示例(一)_转
    asp.net删除目录,Session丢失
    extjs ComboBox使用注意
    转:使Eclipse的智能感知可以像 Visual Studio 一样快速提示
    Android ContentProvider 填删改查 实例
    Windows Phone StackPanel 布局示例
  • 原文地址:https://www.cnblogs.com/Answer1215/p/5851666.html
Copyright © 2011-2022 走看看