字符串上的Scala折叠导致“类型不匹配;找到:任何”

时间:2014-05-04 20:33:21

标签: scala functional-programming

我在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,",它是相似的,但并不能完全澄清事情。

1 个答案:

答案 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的可能类型为CharAnyValAny。您传递的是String,因此Any是唯一的常见类型,这意味着xy的类型为Any,其中没有contains方法。

您需要将累加器类型与元素类型不同,因此您需要使用foldLeft

相关问题