首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >转换程序和将javascript代码快速移植到code代码

转换程序和将javascript代码快速移植到code代码
EN

Stack Overflow用户
提问于 2014-10-11 05:12:04
回答 1查看 624关注 0票数 3

我正在试着用swift来练习编写转换器,但我无法成功地将这个功能的javascript代码转换为writing。

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

代码语言:javascript
复制
    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 ) ) );
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-10-11 06:32:08

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

代码语言:javascript
复制
whatever, input -> whatever

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

代码语言:javascript
复制
(U, T) -> U

(对泛型类型使用通常的短名T、U)。换能器是一种函数,它以一个约简函数作为参数,并返回另一个约简函数。

代码语言:javascript
复制
(whatever, input -> whatever) -> (whatever, input -> whatever)

对应的Swift类型是

代码语言:javascript
复制
((U,T) -> U) -> (U,T) -> U

mapping()将转换作为参数返回换能器,因此必须将其定义为

代码语言:javascript
复制
func mapping<T,U> (transform:(T) -> T) -> ((U,T)->U) -> (U,T) -> U

( mapping的第一个内部函数中的参数更好地称为“减速器”,而不是“转换器”,因为它是返回值的参数。)

在你的例子中,

代码语言:javascript
复制
concat : ([Int], Int) -> [Int]

是一种还原功能,而mapping(addOne)是一种换能器,因此

代码语言:javascript
复制
mapping(addOne)(concat) : ([Int], Int) -> [Int]

是另一个还原函数,所以

代码语言:javascript
复制
var example3 = [1,2,3].reduce([], mapping(addOne)(concat))

给出了结果[2,3,4]

完整的示例代码:

代码语言:javascript
复制
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]
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26311327

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档