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

2022-03-08 14:31:44 +08:00
 TWorldIsNButThis

经典的

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 ,结果只能取值或者取函数进行调用

2704 次点击
所在节点    JavaScript
21 条回复
murmur
2022-03-08 14:34:03 +08:00
看了半天没看懂你要说什么,能给出一个你需要的执行效果么,这种嵌套 if 我认为没问题

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

哪个语言语法糖多你就用哪个啊
dcsuibian
2022-03-08 14:40:22 +08:00
如果 a 和 b 是对象的话,doSth( )?.doOtherThing( )?.doAnotherThing( )也许可以满足你的要求
murmur
2022-03-08 14:41:51 +08:00
@dcsuibian 他不是连续的链式调用,是把前面的作为参数给了后面的函数,b 那里的省略号都不知道啥逻辑。。。
lmshl
2022-03-08 15:08:23 +08:00
讲道理 explicit null + CFA 肯定比 Maybe Monad 入门更容易。
Union Type 也比 Either 更容易,总不能让每个人都学一遍 Monad Transform 吧。
虽然我都会写,但我不否认 explicit null 的心智负担是真的低
lmshl
2022-03-08 15:10:31 +08:00
```EitherT<Promise, Exception, A>```
```OptionT<Promise, A>```
要是让前端们写这个,他们还不提刀顺着网线来见你
neptuno
2022-03-08 15:11:43 +08:00
你是说 swift 里面的 objectA?.value 或者是 objectB !这种特性吗
debuggerx
2022-03-08 15:25:30 +08:00
因为太蹩脚了,不屑于用。
leopod1995
2022-03-08 15:27:03 +08:00
cheng6563
2022-03-08 15:33:41 +08:00
本来就是程序语言不支持才搞出一堆设计模式
yazinnnn
2022-03-08 15:34:09 +08:00
没有 do {
} 或者 bind 语法的话,其实也挺累的
zhuangzhuang1988
2022-03-08 15:50:42 +08:00
脱裤子放屁的功能
yor1g
2022-03-08 16:05:48 +08:00
rxjs ? pipe?
IvanLi127
2022-03-08 16:08:56 +08:00
你在说啥,能不能把 kotlin 对应的优雅写法举例出来看看,不然有点难理解你想要的是什么。
yazinnnn
2022-03-08 16:24:53 +08:00
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
2022-03-08 16:41:15 +08:00
JS 有没有我不知道 但是 fp-ts 好(zhuang)用(bi)的一笔
haozhang
2022-03-08 16:45:46 +08:00
https://github.com/Summerlve/js-optional
6 年前写的 js- optional ,当时就有这想法,可惜现在的 js 被 tc39 一群蠢驴外加一路牛鬼蛇神搞得乌烟瘴气。
noe132
2022-03-08 16:52:12 +08:00
参考 fp-ts ,
可以 mapLeft 然后再 pipe 起来
Exuanbo
2022-03-08 20:17:49 +08:00
强烈推荐 purify-ts
Exuanbo
2022-03-08 20:26:12 +08:00
TWorldIsNButThis
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 看了一下很精简啊,感谢推荐

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/838862

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX