我正在尝试在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 ) ) );
答案 0 :(得分:3)
根据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) -> U
mapping()
将转换作为参数返回传感器,
所以它必须定义为
func mapping<T,U> (transform:(T) -> T) -> ((U,T)->U) -> (U,T) -> U
(也可以更好地调用mapping
的第一个内部函数中的参数
&#34;减速器&#34;而不是&#34; transducer&#34;,因为它是返回值的参数。)
在您的示例中,
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]