Shell

更多文件操作类shell

https://github.com/you-dont-need/You-Dont-Need-GUI#i-cant-remember-these-cryptic-commands

收集

codesandbox 查看某个库的相关示例

dependencies 中点击
image.png
下拉查看更多
image.png
继续添加 dependencies 或根据例子环境进行筛选
image.png

Programming

谓词 predicate

概念复习,谓词,表示一个可以产生 真 / 假 结果的表达式。严格意义上来说必须是一个 boolean 类型,但 js 中存在隐式转换,所以范围更广。

FP

不可变

不再简单地将值赋予变量,而是将值赋予指定类型的容器,通过类型约束,实现值类型不可变。再始终通过一个不可改变容器类(type class)来操作,做到操作物及其类型不变。
容器+类型(值类型) 不变,通过 map 来修改容器内的值(解开容器)。如 Option,在Option容器操作中,它都是一个盒子,只有操作结束,才将内部的值取出。中途的操作都是通过 map ,或 chain 将外部的内容装进容器(赋予容器)。
这样本质上还是在操作一个不变的容器,比如一个 装了水的瓶子,倒掉一半水,它还是一个 装了水的瓶子。
常见的容器就是 monad

Either / Option

  1. import * as E from 'fp-ts/Either'
  2. const parseIntResult: E.Either<string, number> = E.right(3)
  3. const discardErrorMessage: O.Option<number> = O.fromEither(parseIntResult)
  4. const addErrorMessage: E.Either<string, number> = pipe(
  5. discardErrorMessage,
  6. E.fromOption(() => 'could not parse to number'),
  7. )

语义化

  1. // FP
  2. pipe(
  3. fromNullable(name),
  4. chain(fromPredicate(isAuthor)),
  5. map(lowercase),
  6. alt(() =>
  7. pipe(fromNullable(name), chain(flow(lastName, fromNullable)))
  8. )
  9. )
  10. // normal
  11. let modifiedName: string | undefined = undefined
  12. if (name) {
  13. if (isAuthor(name)) {
  14. modifiedName = lowercase(name);
  15. } else {
  16. const last = lastName(name);
  17. if (last) {
  18. modifiedName = last;
  19. }
  20. }
  21. }

函数式在实现控制流时可以采用更语义化的方式,这里的除了 pipe/flow 用于描述流程和执行(拍平减少嵌套),chain/map 用于 解/赋 容器,核心流程就剩:

  1. fromNullable(name)
  2. Predicate(isAuthor)
  3. lowercase
  4. alt
  5. ...

其实就是控制流的语义,但是却不再需要 let 设置可变变量,不再需要嵌套控制流。