我正在试着用swift来练习编写转换器,但我无法成功地将这个功能的javascript代码转换为writing。
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 ) ) );发布于 2014-10-11 06:32:08
根据http://phuu.net/2014/08/31/csp-and-transducers.html和http://blog.cognitect.com/blog/2014/8/6/transducers-are-coming,约简函数具有签名。
whatever, input -> whatever在Swift中,这是一个类型的函数(或闭包)
(U, T) -> U(对泛型类型使用通常的短名T、U)。换能器是一种函数,它以一个约简函数作为参数,并返回另一个约简函数。
(whatever, input -> whatever) -> (whatever, input -> whatever)对应的Swift类型是
((U,T) -> U) -> (U,T) -> Umapping()将转换作为参数返回换能器,因此必须将其定义为
func mapping<T,U> (transform:(T) -> T) -> ((U,T)->U) -> (U,T) -> U( mapping的第一个内部函数中的参数更好地称为“减速器”,而不是“转换器”,因为它是返回值的参数。)
在你的例子中,
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]https://stackoverflow.com/questions/26311327
复制相似问题