func mapGen<T>(transform:((T)->T),collection:Array<T>) -> Array<T> {
func cat<T>(initial:Array<T>,element:T) -> Array<T> {
var mInitial = initial;
var telement = transform(element);
mInitial.append(telement);
return mInitial;
}
var k = collection.reduce([],cat);
return k;
}
我在尝试运行这段代码时遇到了问题。 我很快就能帮助我了吗?
我正在尝试用一个看起来不起作用的reduce函数编写一个通用映射。
答案 0 :(得分:4)
下面:
func mapGen<T>(transform:((T)->T),collection:Array<T>) -> Array<T> {
您正在定义泛型类型T,并在嵌套函数中:
func cat<T>(initial:Array<T>,element:T) -> Array<T> {
你正在(重新)定义一个具有相同名称的新泛型类型,但实际上它是一个不同的类型 - 你甚至可以将它命名为V或NewType,你仍然有相同的错误。
我推断在你的情况下你希望嵌套函数使用相同的T类型,所以不要重新定义它:
func cat(initial:Array<T>,element:T) -> Array<T> {
它应该按预期工作
答案 1 :(得分:1)
要使错误消息(当前听起来非常不合情理)更清晰,让我们重命名您的类型变量,这样您就不会有两个具有相同名称的类型变量:
func mapGen<T1>(transform:((T1)->T1),collection:Array<T1>) -> Array<T1> {
func cat<T2>(initial:Array<T2>,element:T2) -> Array<T2> {
var mInitial = initial;
var telement = transform(element);
mInitial.append(telement);
return mInitial;
}
var k = collection.reduce([],cat);
return k;
}
现在错误消息变为&#34; T1不会转换为T2&#34;,这更有意义。您收到该错误的原因是表达式transform(element)
。 element
的类型为T2
,但transform
期望参数类型为T1
。
根本问题是,您承诺cat
可以使用任何给定类型,但实际上它只能使用外部T
的值,因此解决方案将是只需删除cat
的类型参数,并在其参数类型中使用外部T
。