zoukankan      html  css  js  c++  java
  • [Functional Programming] liftA2 and converge

    Sometimes I am confused with 'liftA2' and 'converge' functions. 

    Main difference between those is that:

      liftA2 takes applicative functor as second and third arguements, for example, array

      converge takes functions as second and third arguements

    // liftA2 :: Applicative m => (a -> b -> c) -> m a -> m b -> m c
    // converge :: (b -> c -> d) -> (a -> b) -> (a -> c) -> a -> d
    // liftA2 :: Applicative m => (a -> b -> c) -> m a -> m b -> m c
    // converge :: (b -> c -> d) -> (a -> b) -> (a -> c) -> a -> d
    const { option, curry, liftA2, converge } = require("crocks");
    const { getState } = require("../../helper");
    
    // getColors :: () -> State AppState [String]
    const getColors = () => getState("colors").map(option([]));
    
    // getShapes :: () -> State AppState [String]
    const getShapes = () => getState("shapes").map(option([]));
    
    // buildCard :: String -> String -> Card
    const buildCard = curry((color, shape) => ({
      id: `${color}-${shape}`,
      color,
      shape
    }));
    
    // buildCards :: [String] -> [String] -> [Card]
    const buildCards = liftA2(buildCard);
    
    // generateCards :: () -> State AppState [ Card ]
    const generateCards = converge(liftA2(buildCards), getColors, getShapes);
    
    module.exports = {
      generateCards
    };
  • 相关阅读:
    使用Docker搭建nginx环境
    使用Docker搭建apache环境
    字符编码-字库表,字符集,字符编码
    go中的sync.pool源码剖析
    JAVA基础语法
    Linux 文件目录管理
    c++ 学习之常用时间函数一览
    MySQL Innodb 中的锁
    MySQL 索引与 B+ 树
    MySQL 表分区操作详解
  • 原文地址:https://www.cnblogs.com/Answer1215/p/11308513.html
Copyright © 2011-2022 走看看