Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Typescript:声明并实现curried方法_Typescript_Currying - Fatal编程技术网

Typescript:声明并实现curried方法

Typescript:声明并实现curried方法,typescript,currying,Typescript,Currying,在以下类的框架中 class Iterable<A> { filter( filter: ( value: A ) => boolean ): Iterable<A> { ... } map<B>( f: ( value: A, index?: number ) => B ): Iterable<B> { ...} collect = <B>( filter: ( value: A ) =>

在以下类的框架中

class Iterable<A> {

    filter( filter: ( value: A ) => boolean ): Iterable<A> { ... }

    map<B>( f: ( value: A, index?: number ) => B ): Iterable<B> { ...}

    collect = <B>( filter: ( value: A ) => boolean ) => ( mapper: ( value: A ) => B ): Iterable<B> => { ... }

}
此属性基本上是一个curried函数,它将两个函数作为参数,并返回一个
Iterable
。使用
,作为一个
可编辑的
,它可以以下列方式使用:

const it: Iterable<string> = this.collect<string>( f => true )( ( v: A ) => v.toString() )
是无效的


解决方案:(参见@JLRishe和@NitzanTomer answers)我选择了显式类型声明:

collect<B>(filter: (value: A) => boolean): (mapper: (value: A) => B) => Iterable<B> {
    return (mapper: (value: A) => B) => this.filter(filter).map(mapper);
}
collect(过滤器:(值:A)=>boolean):(映射器:(值:A)=>B)=>Iterable{
返回(映射器:(值:A)=>B)=>this.filter(filter.map)(映射器);
}

您可以这样实现它:

collect<B>(filter: (value: A) => boolean) {
    return (mapper: (value: A) => B) => this.filter(filter).map(mapper);
}
collect(过滤器:(值:A)=>boolean){
返回(映射器:(值:A)=>B)=>this.filter(filter.map)(映射器);
}

您可以这样实现它:

collect<B>(filter: (value: A) => boolean) {
    return (mapper: (value: A) => B) => this.filter(filter).map(mapper);
}
collect(过滤器:(值:A)=>boolean){
返回(映射器:(值:A)=>B)=>this.filter(filter.map)(映射器);
}
怎么样

collect<B>(filter: (value: A) => boolean) {
    return (mapper: (value: A) => B): Iterable<B> => {
        return this.filter(filter).map(mapper);
    };
}
collect(过滤器:(值:A)=>boolean){
返回(映射器:(值:A)=>B):Iterable=>{
返回此.filter(filter).map(mapper);
};
}
怎么样

collect<B>(filter: (value: A) => boolean) {
    return (mapper: (value: A) => B): Iterable<B> => {
        return this.filter(filter).map(mapper);
    };
}
collect(过滤器:(值:A)=>boolean){
返回(映射器:(值:A)=>B):Iterable=>{
返回此.filter(filter).map(mapper);
};
}

您也可以为您的班级输入代码吗?例如,这个
A
是什么,这个.filter返回什么?etc..@NitzanTomer
A
是一个泛型,请参见我在上面的编辑以及类的框架。您也可以为您的类添加代码吗?例如,这个
A
是什么,这个.filter返回什么?etc..@NitzanTomer
A
是一个泛型,请参见我上面的编辑和类的框架谢谢。与JLRishe相同的解决方案。。。谁在时钟上打败了你(根据SO)谢谢。与JLRishe相同的解决方案。。。谁在时钟上打败了你(根据SO)
collect<B>(filter: (value: A) => boolean) {
    return (mapper: (value: A) => B): Iterable<B> => {
        return this.filter(filter).map(mapper);
    };
}