在Scala中对压缩列表使用map时类型不匹配



考虑以下代码:

/** Takes a list and turns it into an infinite looping stream. */
def loop(l: List[Char]): LazyList[Char] = {
l.to(LazyList)  #:::loop(l)
}
/** Encodes a sequence of characters with a looped key. */
def codec(message: Seq[Char], key: Seq[Char], cipher: (Char, Char) => Char): Seq[Char] = {
val loopedKey = loop(key.toList)
val mergedMessage = message.toList zip loopedKey
val xorResult = mergedMessage.map(cipher)
xorResult.toSeq
}

循环函数是正确的,但是名为codec的函数在编译时产生以下错误:

[error]  type mismatch;
[error]  found   : (Char, Char) => Char
[error]  required: ((Char, Char)) => ?
[error]     val xorResult = mergedMessage.map(cipher)

我不明白为什么required部分写着:((Char, Char)) => ?

(Char, Char) => Char是一个接受2个Chars并返回Char的函数,而zip将产生一个元组(Char, Char)的集合。一种选择是更改cipher类型以接受元组-((Char, Char)) => Char:

def codec(message: Seq[Char], key: Seq[Char], cipher: ((Char, Char)) => Char): Seq[Char] = ...

不直接更改签名访问元组元素:

val xorResult = mergedMessage.map(t => cipher(t._1, t._2))

或者直接使用tupled:

val xorResult = mergedMessage.map(cipher.tupled)

最新更新