【问题标题】:Strange Scala 'Type mismatch' error for tuples元组的奇怪 Scala“类型不匹配”错误
【发布时间】:2018-07-20 07:00:46
【问题描述】:

我有一个函数map,它接受一个Parser 和一个定义如下的函数:

def map[T1, T2](parser: Parser[T1], func: T1 => T2): Parser[T2]

我创建了一个 Parser 类型的 [(Char, Char)] 对象和一个函数 (Char, Char) => String

val parser[(Char,Char)] = //...
val asString: (Char, Char) => String = (a: Char, b: Char) => a.toString + b.toString

然后我将这两个传递给map 函数。

val mParser: Parser[String] = map(parser, asString)

我希望一切正常,但我收到asString 参数的类型不匹配错误

错误:(26, 41) 类型不匹配;

找到 : (Char, Char) => 字符串

必需:((Char, Char)) => 字符串

map[(Char, Char), String](parser, asString)

我尝试将map 的类型明确指定为map[(Char, Char), String](parser, asString),但这也无济于事。

这里的T1 类型是字符元组(Char, Char)T2String。因此,函数 (Char, Char) => String 应该是输入,但 scala 期待不同的类型。

我在这里缺少什么?为什么它期待((Char, Char)) => String 而不是(Char,Char) => String

我使用的是 Scala 2.12。不知道这是否相关。

感谢您的帮助。

【问题讨论】:

  • 你可以试试map(parser -> asString) 吗? Here您可以获取更多关于地图的信息。
  • 那是什么?我没有使用哈希图。我说的是我定义的map 函数。
  • 对不起,我错过了

标签: scala generics types tuples scala-generics


【解决方案1】:

(Char, Char) => String 类型对应一个函数,它接受两个 Char 参数并返回一个 String。

你想要的是一个函数,它接受 Tuple2 并返回一个不同的字符串。

它的类型应该是Tuple2[Char, Char] => StringTuple2[Char, Char] 对应于类型简写 (Char, Char) 但我猜在函数定义期间编译器将括号解释为好像它们用于对函数参数进行分组一样。

这是一个已知问题,正在 scala3 中解决。 https://dotty.epfl.ch/docs/reference/auto-parameter-tupling.html

【讨论】:

  • 谢谢,我现在明白了。我应该认为(Char, Char) 被解释为两个参数而不是一个元组。我确实尝试在 ((Char, Char)) 周围添加括号,但 IntelliJ 将它们显示为不必要的括号,因此我删除了它们。对于相对较新的人来说,这可能会有些混乱。我希望他们能尽快修复它。
  • @DurgaSwaroop 我最近遇到了同样的问题。你不应该相信 IntelliJ 它经常出错。
  • @DurgaSwaroop 将其作为错误报告给 IntelliJ(检查重复项后)?
【解决方案2】:

正如其他人指出的那样,定义一个接受Tuple2 而不是两个参数的函数会有点棘手,而且看起来很丑陋。

一个很好的解决方法是使用.tupled

 val asString: (Char, Char) => String = (a: Char, b: Char) => a.toString + b.toString
 val mParser: Parser[String] = map(parser, asString.tupled)

FunctionN.tupled 将接受 N 个参数的函数转换为接受 TupleN 的等效函数。 这比定义一个 tuple-taking 函数要好一些,因为你遇到了括号怪癖,而且你不必在 body 中解构 tuple。

【讨论】:

  • 这很有趣。我想我以前没听说过。我认为这也会更具可读性。
猜你喜欢
  • 1970-01-01
  • 2014-09-13
  • 2013-06-10
  • 1970-01-01
  • 2012-02-16
  • 1970-01-01
  • 1970-01-01
  • 2017-09-05
  • 1970-01-01
相关资源
最近更新 更多