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)
  • 相关阅读:
    Pytorch-实战之对Himmelblau函数的优化
    Pytorch-tensor的感知机,链式法则
    Pytorch-tensor的激活函数
    Pytorch-tensor的分割,属性统计
    Pytorch-tensor的转置,运算
    Pytorch-tensor维度的扩展,挤压,扩张
    Transformer代码细节
    Leetcode 1494
    格雷码
    两个正序数组的中位数
  • 原文地址:https://www.cnblogs.com/Answer1215/p/10402139.html
Copyright © 2011-2022 走看看