• [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)
  • 相关阅读:
    正则表达式预:
    cookie 二:
    Javascript之运动框架2
    cookie预:
    Javascript之链式运动框架1
    基于Azure的软件部署和开发系列沙龙
    在Docker中安装.NET Core(使用命令行工具)
    Xshell 无法连接虚拟机中的ubuntu的问题
    springboot09-redis
    springboot08-jpa-mysql
  • 原文地址:https://www.cnblogs.com/Answer1215/p/10402139.html
Copyright © 2020-2023  润新知