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 · 2969 次点击
    这是一个创建于 1016 天前的主题,其中的信息可能已经有所发展或是发生改变。

    经典的

    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   ·   实用小工具   ·   1825 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 16:23 · PVG 00:23 · LAX 08:23 · JFK 11:23
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.