zoukankan      html  css  js  c++  java
  • [Functional Programming] Write a simple version of Maybe

    Maybe has two types: Just / Nothing. Just() will just return the value that passed in. Nothing returns nothing...

    Just/ Nothing are both functors, they should have .map() method:

    const Just = x => ({
        map: f => Just(f(x)),
        inspect: () => `Just ${x}`,
    })
    
    const Nothing = x => ({
        map: f => Nothing('Nothing'),
        inspect: () => `${x}`,
    })
    
    const Maybe = {
        Just,
        Nothing
    }

    We added 'inspect' method so that in REPL we can log out understandable message. for example, 'Just 4'  instead of '{ map: [Function: map] }'.... or whatever...

    Currently, the code below return 'Just 5'

    const inc = n => n + 1;
    
    const input = Just(4)
    const result = input.map(inc)

    But we don't need 'Just' as a result, we want just 5; in order to achieve that, we add 'option()' method:

    const Just = x => ({
        map: f => Just(f(x)),
        inspect: () => `Just ${x}`,
        option: (_) => x,
    })
    
    const Nothing = x => ({
        map: f => Nothing('Nothing'),
        inspect: () => `${x}`,
        option: defVal => defVal
    })

    For Just, it return whatever the current value 'x', ignore the default value we passed in; Nothing it will return the defautl vlaue back.

    Now, we got:

    const input = Just(4)
    const
    result = input.map(inc).option(0) // 5 const input = Nothing(4) const result = input.map(in) // Nothing const result = input.map(inc).option(0) // 0

    Since we don't know it should be Just or Nothing, we can use some predict function as helper:

    const safeNum = num => typeof num === 'number' ? Maybe.Just(num): Maybe.Nothing()
    const input = safeNum(4)
    const result = input.map(inc).option(0) // 5
    
    
    const input = safeNum('4')
    const result = input.map(inc).option(0) // 0

    ---------------

    const Just = x => ({
        map: f => Just(f(x)),
        inspect: () => `Just ${x}`,
        option: (_) => x,
    })
    
    const Nothing = x => ({
        map: f => Nothing('Nothing'),
        inspect: () => `${x}`,
        option: defVal => defVal
    })
    
    const safeNum = num => typeof num === 'number' ? Maybe.Just(num): Maybe.Nothing()
    
    const Maybe = {
        Just,
        Nothing
    }
    
    const inc = n => n + 1;
    
    const input = safeNum(4)
    const result = input.map(inc).option(0)
    
    console.log(result)
  • 相关阅读:
    2018年7月10日笔记
    2018年7月7日笔记
    2018年7月5日笔记
    2018年7月3日笔记
    sed 命令详解
    《软件构架实践》阅读笔记01
    《掌握需求过程》阅读笔记06
    《掌握需求过程》阅读笔记05
    第十二周进度条
    《掌握需求过程》阅读笔记04
  • 原文地址:https://www.cnblogs.com/Answer1215/p/10402139.html
Copyright © 2011-2022 走看看