时间:2022-11-12 10:14:01
const result array=input array|filter (,str=str.length=0)/hack|map )、str='[' str '] )/hack|
要创建新运算符,如果用|表示Hack语法,用|表示F#语法呢?
const result array=input array|filter (,str=str.length=0)/hack|map )、str='[' str '] )/hack|
如何用现有语法模拟Pipe无需Pipeoperator(|) for JavaScript的建议,也可以利用js中的现有语法模拟Pipe效果。 以下是一些方案。
Function.pipe ( )使用自定义函数构建pipe方法。 此语法类似于F#。
const resultset=function.pipe ( inputset,$=filter($,x=x=0) $=map($,x=x * 2) $=new Set($ ) ) )
使用中间变量说白了就是分解Pipe流程,一步一步地写:
constfiltered=filter(inputset,x=x=0) const mapped=map ( filtered,x=x * 2) const resultset=newset ( mapped ) )
改造复用变量,将中间变量变为复用:
let$=inputset$=filter($,x=x=0) $=map($ ) $,x=x * 2) const resultSet=new Set($ ) $这样做可能会导致变量污染
精读Pipe Operator语义的价值非常明显,它还可以改变编程思路,在串行处理数据时非常重要,因此命令行场景非常常见:
cat 'somefile.txt' | echo的命令行是典型的输入输出场景,因为大部分都是单输入、单输出。
处理普通代码场景,特别是处理数据时也需要此特性。 大多数具有抽象思维的代码都进行了各种类型的管道抽象,包括:
如果constnewvalue=pipe(value,doSomething1,doSomething2,doSomething3) pipeoperator(|) for JavaScript的提案通过,将实现pipe动作
const new value=value|do something1( % )| doSomething3(% ) % )这等效于以下内容:
const new value=do something3( do something2) dosomething1) value ) )显然,利用pipe特性写处理流更直观,执行逻辑和解读逻辑一致
实现pipe函数无需pipeoperator(|) for JavaScript建议,即可在一行中实现pipe函数。
constpipe=(args )=args.reduce ) ( ACC,el ) ) ),但是不可能实现Hack参数样式,最多实现F#参数样式
根据js实现pipe语法的考虑事项提案记录,F#失败的原因有三个。
内存性能问题。 await特殊语法。 打破js生态。 其中js生态意味着,由于F#语法的特殊性,如果依照该语法实现功能的数据库过多,就有可能无法复用到非Pipe语法场景中。
一些成员反对“隐藏编程”( Tacit programming ),而另一些成员反对表象化建议Partial Application Syntax。 它们使js支持的编程样式与当前大不相同。
位于轻蔑链顶端的编程风格能否得到js的支持,这不是能否得到的问题,而是是否不想得到的问题。
pipe语法的弊端其次是普通的setState语法:
setstate(state=)…state,value: 123} ) )改为immer表示法如下。
setstate ( produce ( draft=draft.value=123 ) )多亏了ts型的自动导出,在内层的produce中已经知道value是字符串型,此时输入字符串的话就会出现错误
但是,如果写成pipe模式的话:
由于produce(draft=draft.value=123 )| setState先考虑如何修改数据,因此此时不知道后面的pipe流程是什么,因此无法确定draft的类型。 因此,pipe语法仅适用于固定数据处理流。
将pipe直译为管道,是“数据像流水线一样处理”的潜在含义。 也可以将每个函数想象为单独的管道。 很明显,下一个管道处理上一个管道的数据,并将结果作为输入输出到下一个管道。
合适的管道数量和体积决定了生产线是否高效。 过多的管道类型反而会使管线变得零散杂乱。 过少的配管会使管线变得沉重而难以展开。 这是工作中最大的考验。
讨论地址精读《pipe operator for JavaScript》issue # 395dt-Fe/weekly