我在Scala中玩弄折叠,无论出于何种原因,最后尝试通过执行以下操作来测试String是否只包含唯一字符:
str
.fold(""){ (x, y) => if (!(x contains y)) x + y else x }
.size == str.size
这会导致错误
error: type mismatch;
found: Any
required: String
显然指向y
的价值。
有人能提供这方面的见解吗?
我不会预料到这种行为,而我能找到的最接近的答案是"Scala assumes wrong type when using foldLeft,",它是相似的,但并不能完全澄清事情。
答案 0 :(得分:6)
您应该使用foldLeft
代替fold
:
str
.foldLeft(""){ (x, y) => if (!(x contains y)) x + y else x }
.size == str.size
fold
的签名是:
fold[A1 >: Char](z: A1)(op: (A1, A1) ⇒ A1): A1
所以fold
期望元素类型是累加器类型的下限。对于Char
,元素类型为String
,因此A1
的可能类型为Char
,AnyVal
和Any
。您传递的是String
,因此Any
是唯一的常见类型,这意味着x
和y
的类型为Any
,其中没有contains
方法。
您需要将累加器类型与元素类型不同,因此您需要使用foldLeft
。