gpt4 book ai didi

ios - transducer 和 swift 将 javascript 代码移植到 swift 代码

转载 作者:搜寻专家 更新时间:2023-10-31 22:36:17 25 4
gpt4 key购买 nike

我正在尝试练习在 swift 中编写转换器,但我无法成功地将此功能性 javascript 代码转换为 swift。

http://phuu.net/2014/08/31/csp-and-transducers.html

    function mapping(transform) {
return function (reduce) {
return function (result, input) {
return reduce(result, transform(input));
};
};
}


func mapping<T,U> ( transform:(T)-> T ) -> ( (U,T)-> ( (U,T)->U ) ) {

return { ( transducer:(U,T) ) -> ( (U,T)->U ) in

return { (initial:U,element:T) -> U in


var transformedElement = transform(element);

var mInitial = transducer(initial,transformedElement); // this line is the problem

return mInitial;
}
}




func addOne (a:Int) -> (Int) {
return a+1;
}

func concat (c:Array<Int>,element:Int) -> (Array<Int>) {
var collection = c;

collection.append(element);

return collection;

}

var example3 = [1,2,3].reduce([], concat( mapping ( addOne ) ) );

最佳答案

根据 http://phuu.net/2014/08/31/csp-and-transducers.htmlhttp://blog.cognitect.com/blog/2014/8/6/transducers-are-coming ,reducing function 具有签名

whatever, input -> whatever

在 Swift 中,这是一个类型的函数(或闭包)

(U, T) -> U

(对通用类型使用通常的简称 T、U)。transducer 是一个以一个归约函数作为参数的函数并返回另一个归约函数

(whatever, input -> whatever) -> (whatever, input -> whatever)

对应的Swift类型是

((U,T) -> U) -> (U,T) -> U

mapping() 将转换作为参数并返回转换器,所以它必须定义为

func mapping<T,U> (transform:(T) -> T) -> ((U,T)->U) -> (U,T) -> U

(另外,mapping 的第一个内部函数中的参数最好称为“reducer”而不是“transducer”,因为它是返回值的参数。)

在你的例子中,

concat : ([Int], Int) -> [Int]

是一个归约函数,mapping(addOne) 是一个转换器,因此

mapping(addOne)(concat) : ([Int], Int) -> [Int]

是另一个归约函数,因此

var example3 = [1,2,3].reduce([], mapping(addOne)(concat))

给出结果 [2,3,4]

完整示例代码:

func mapping<T,U> (transform:(T) -> T) -> ((U,T)->U) -> (U,T) -> U {
return { (reducer:((U,T) -> U)) -> (U,T) -> U in
return { (initial:U, element:T) -> U in
return reducer(initial,transform(element))
}
}
}
func addOne (a:Int) -> (Int) {
return a+1;
}

// Slightly simplified and generalized:
func concat<T> (c:[T], element:T) -> [T] {
return c + [element];
}


var example3 = [1,2,3].reduce([], mapping (addOne)(concat))
println(example3) // [2, 3, 4]

关于ios - transducer 和 swift 将 javascript 代码移植到 swift 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26311327/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com