【问题标题】:What would you call a function that takes T<A>[] as input and outputs T<A[]>?将 T<A>[] 作为输入并输出 T<A[]> 的函数叫什么?
【发布时间】:2019-11-22 21:29:00
【问题描述】:

一些例子

const f = <L, R>(xs: Either<L, R>[]): Either<L, R[]> => { throw new Error('Not Implemented') };
const f = <T>(xs: Promise<T>[]): Promise<T[]> => { throw new Error('Not Implemented') };
const f = <T>(xs: Box<T>[]): Box<T[]> => { throw new Error('Not Implemented') };

这些都执行某种减少。但是,这里的半群只是一个 List。

从可读性的角度来看,这些函数有什么好名字。

这里显然存在一定程度的主观性,这是 SO 所不鼓励的。但是,我觉得也可以根据一些客观标准/理由来说一个名字的好坏。

也许只有collectgather这行?

【问题讨论】:

标签: typescript functional-programming naming-conventions naming


【解决方案1】:

TypeScript 不是 Haskell,但我通常会去那里查看我正在创建的事物类型是否已经有一个众所周知的名称。

假设Either&lt;L, T&gt;Promise&lt;T&gt;Box&lt;T&gt;都是applicative functors超过T,那么函数签名&lt;L,T&gt;(x: Array&lt;Either&lt;L, T&gt;&gt;) =&gt; Either&lt;L, Array&lt;T&gt;&gt;&lt;T&gt;(x: Array&lt;Promise&lt;T&gt;&gt;) =&gt; Promise&lt;Array&lt;T&gt;&gt;&lt;T&gt;(x: Array&lt;Box&lt;T&gt;&gt;) =&gt; Box&lt;Array&lt;T&gt;&gt;可能会被称为sequence .

关于使类型函数F&lt;T&gt; 应用于T 之上的应用函子的规则草图:您需要有一些像这样运行的函数:

declare function pure<T>(x: T): F<T>;
declare function lift2<A, B, T>(cb: (a: A, b: B) => T): (fa: F<A>, fb: F<B>) => F<T>;

然后sequence 可以这样实现:

function sequence<T>(x: Array<F<T>>): F<Array<T>> {
    return x.reduce(lift2<T[], T, T[]>((xs, x) => xs.concat(x)), pure([]))
}

对于Promise&lt;T&gt;,这相当简单:

function pure<T>(x: T): Promise<T> {
    return Promise.resolve(x);
}
function lift2<A, B, T>(cb: (a: A, b: B) => T): (fa: Promise<A>, fb: Promise<B>) => Promise<T> {
    return (fa: Promise<A>, fb: Promise<B>) => fa.then(a => fb.then(b => cb(a, b)))
}

你也可以想出Either&lt;L, T&gt;Box&lt;T&gt;的。

好的,希望对您有所帮助;祝你好运!

Link to code

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-07
    • 1970-01-01
    • 2014-01-19
    • 2021-07-16
    • 2018-05-11
    相关资源
    最近更新 更多