gpt4 book ai didi

Swift 编写映射、长度、过滤器作为 reduce

转载 作者:IT王子 更新时间:2023-10-29 05:36:56 24 4
gpt4 key购买 nike

作为练习,我尝试将 map、length 和 filter 编写为 reduce 函数。

func map<T>(array: [T], f: (T->T)) -> [T] {
return array.reduce([]) {
(var seed, value) in
seed.append(f(value))
return seed
}
}

func length<T>(array: [T]) -> Int {
return array.reduce(0){ (x,_) in x + 1 }
}

func filter<T>(array: [T], predicate: (T->Bool)) -> [T]{
return array.reduce([]){
(var seed, value) in
if predicate(value){
seed.append(value)
}
return seed
}
}

这是我可以用来将这些函数重写为 reduce 的最优雅的语法吗?第二个问题:map 接受一个函数 f:(T->T)基本上类型说我只能返回类型 T 的东西,但是如果我编写的函数将类型 T 转换为 Bool 或 Int 怎么办......我该如何做到这一点?好像 map 不存在

最佳答案

对于将类型 T 转换为(可能不同的)类型 S 的映射只需使用两种类型的占位符:

func map<T, S>(array: [T], f: (T->S)) -> [S] {
return array.reduce([]) {
(var seed, value) in
seed.append(f(value))
return seed
}
}

例子:

let x = map([1, 2, 3], f: { String($0) })
print(x) // ["1", "2", "3"]

这个“这是最优雅的语法”是否也是一个个人意见问题。如果替换 append() 方法通过与 + 的数组连接然后 seed 参数需要不可变:

func map<T, S>(array: [T], f: (T->S)) -> [S] {
return array.reduce([]) {
(seed, value) in
seed + [f(value)]
}
}

可以用简写参数名写成

func map<T, S>(array: [T], f: (T->S)) -> [S] {
return array.reduce([]) { $0 + [ f($1) ] }
}

类似地:

func filter<T>(array: [T], predicate: (T->Bool)) -> [T]{
return array.reduce([]) { predicate($1) ? $0 + [ $1 ] : $0 }
}

请注意 map()filter() 的实现使用reduce()(而不是循环)非常低效,因为在每个缩减步骤中都会创建一个新数组。参见示例

进行分析。对于练习(如您所说)没关系,只是不要在生产中使用这样的东西)。

关于Swift 编写映射、长度、过滤器作为 reduce,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32873520/

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