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)
  • 相关阅读:
    C# winform判断窗体是否已打开
    对象与json字符串转换类设计
    Redis 操作帮助类
    C# redis客户端帮助类
    RedisHelper Redis帮助类
    Vue.js实现tab切换效果
    Uni-app 使用总结
    C#中的委托和事件(续)
    12小时超级马拉松赛记
    2016年8月份
  • 原文地址:https://www.cnblogs.com/Answer1215/p/10402139.html
Copyright © 2011-2022 走看看