为什么一些 js/ts 的函数工具库没有类似 optional/maybe 的东西 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐关注
Meteor
JSLint - a Javascript code quality tool
jsFiddle
D3.js
WebStorm
推荐书目
Javascript 权威指南第 5 版
Closure: The Definitive Guide
TWorldIsNButThis
V2EX    Javascript

为什么一些 js/ts 的函数工具库没有类似 optional/maybe 的东西

  •  
  •   TWorldIsNButThis 2022-03-08 14:31:44 +08:00 3478 次点击
    这是一个创建于 1313 天前的主题,其中的信息可能已经有所发展或是发生改变。

    经典的

    const a = doSth() if(a) { const b = doOtherThing(a) if (b) { ... return xxx } } return yyy 

    提供什么 pipe chain flow 有啥用,连这个常见的 pattern 都抽象不出来还搞啥 functional programming

    而 optional chain 又不是 kotlin 有 scope 函数可以灵活调整 receiver ,结果只能取值或者取函数进行调用

    21 条回复    2022-03-09 08:41:04 +08:00
    murmur
        1
    murmur  
       2022-03-08 14:34:03 +08:00
    看了半天没看懂你要说什么,能给出一个你需要的执行效果么,这种嵌套 if 我认为没问题

    js 就是 js ,js 不需要是其他语言,不会都 2022 年了,还有人认为语句的长度反比于执行性能把

    哪个语言语法糖多你就用哪个啊
    dcsuibian
        2
    dcsuibian  
       2022-03-08 14:40:22 +08:00
    如果 a 和 b 是对象的话,doSth( )?.doOtherThing( )?.doAnotherThing( )也许可以满足你的要求
    murmur
        3
    murmur  
       2022-03-08 14:41:51 +08:00
    @dcsuibian 他不是连续的链式调用,是把前面的作为参数给了后面的函数,b 那里的省略号都不知道啥逻辑。。。
    lmshl
        4
    lmshl  
       2022-03-08 15:08:23 +08:00
    讲道理 explicit null + CFA 肯定比 Maybe Monad 入门更容易。
    Union Type 也比 Either 更容易,总不能让每个人都学一遍 Monad Transform 吧。
    虽然我都会写,但我不否认 explicit null 的心智负担是真的低
    lmshl
        5
    lmshl  
       2022-03-08 15:10:31 +08:00
    ```EitherT<Promise, Exception, A>```
    ```OptionT<Promise, A>```
    要是让前端们写这个,他们还不提刀顺着网线来见你
    neptuno
        6
    neptuno  
       2022-03-08 15:11:43 +08:00
    你是说 swift 里面的 objectA?.value 或者是 objectB !这种特性吗
    debuggerx
        7
    debuggerx  
       2022-03-08 15:25:30 +08:00
    因为太蹩脚了,不屑于用。
    cheng6563
        9
    cheng6563  
       2022-03-08 15:33:41 +08:00
    本来就是程序语言不支持才搞出一堆设计模式
    yazinnnn
        10
    yazinnnn  
       2022-03-08 15:34:09 +08:00
    没有 do {
    } 或者 bind 语法的话,其实也挺累的
    zhuangzhuang1988
        11
    zhuangzhuang1988  
       2022-03-08 15:50:42 +08:00
    脱裤子放屁的功能
    yor1g
        12
    yor1g  
       2022-03-08 16:05:48 +08:00
    rxjs ? pipe?
    IvanLi127
        13
    IvanLi127  
       2022-03-08 16:08:56 +08:00
    你在说啥,能不能把 kotlin 对应的优雅写法举例出来看看,不然有点难理解你想要的是什么。
    yazinnnn
        14
    yazinnnn  
       2022-03-08 16:24:53 +08:00   1
    f#
    async {
    let! result = workTask |> Async.AwaitTask
    do printfn $"the result is {result}"
    }

    haskell
    do
    x <- initialExpression
    y <- expressionUsingX x
    z <- expressionUsingY y
    return x+y+z

    scala

    for {
    x <- initialExpression
    y <- expressionUsingX(x)
    z <- expressionUsingY(y)
    } yield {
    x+y+z
    }

    kotlin
    nullable{
    val a = optA().bind()
    val b = foo(a).bind()
    bar(c)
    }
    intmax2147483647
        15
    intmax2147483647  
       2022-03-08 16:41:15 +08:00
    JS 有没有我不知道 但是 fp-ts 好(zhuang)用(bi)的一笔
    haozhang
        16
    haozhang  
       2022-03-08 16:45:46 +08:00 via iPhone
    https://github.com/Summerlve/js-optional
    6 年前写的 js- optional ,当时就有这想法,可惜现在的 js 被 tc39 一群蠢驴外加一路牛鬼蛇神搞得乌烟瘴气。
    noe132
        17
    noe132  
       2022-03-08 16:52:12 +08:00 via Android
    参考 fp-ts ,
    可以 mapLeft 然后再 pipe 起来
    Exuanbo
        18
    Exuanbo  
       2022-03-08 20:17:49 +08:00 via iPhone
    强烈推荐 purify-ts
    Exuanbo
        19
    Exuanbo  
       2022-03-08 20:26:12 +08:00 via iPhone
    TWorldIsNButThis
        20
    TWorldIsNButThis  
    OP
       2022-03-08 21:50:34 +08:00
    @murmur ...就是可能继续有嵌套的 if(b) if(c) if(d)

    @dcsuibian
    @leopod1995 这个只能取值,不能作为参数,或者说不能 mapping 成新值


    @IvanLi127 kotlin 的有 scope function ,

    if (a) {
    const b = doSth(a)
    if (b) {
    ...
    }
    }
    return yyy

    可以变成 a?.let { doSth(it) }?.let { doOtherThing(it) } ?: yyy 第一个 it 就是不为 null 的 a ,第二个 it 就是不为 null 的 b

    @intmax2147483647
    @noe132 fp-ts 看过,但是概念太多了,感觉是一个完整的体系,一时半会整不明白

    @Exuanbo 看了一下很精简啊,感谢推荐
    wangtian2020
        21
    wangtian2020  
       2022-03-09 08:41:04 +08:00
    const a = doSth()
    if (!a) return yyy
    const b = doOtherThing(a)
    if (b) {
    ;('')
    return xxx
    }
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1002 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 24ms UTC 18:34 PVG 02:34 LAX 11:34 JFK 14:34
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86