传感器和swift移植javascript代码到swift代码

时间:2014-10-11 05:12:04

标签: ios swift functional-programming swift-playground

我正在尝试在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 ) ) );

1 个答案:

答案 0 :(得分:3)

根据http://phuu.net/2014/08/31/csp-and-transducers.htmlhttp://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]