Scala链接函数与和类型不匹配

时间:2017-02-19 08:24:31

标签: scala

我有一堆函数可以清理文本并将它们分成单词。最小的例子:

val txt = "Mary had a @little \nlamb"
val stopwords = Seq("a")
def clean(text: String): String = text.replaceAll("\n*\r*", "")
def tokenize(text: String): Seq[String] = text.split("\\s")

val cleaned = clean(txt)
val tokens = tokenize(cleaned)

此代码按预期工作。然而,不是真的惯用。 我原本希望这样做:

clean(txt) andThen tokenize

但是编译器在tokenize函数中使用错误type mismatch; required: Char => ?抱怨这个。

我在这里缺少什么?

1 个答案:

答案 0 :(得分:3)

clean返回String。您正在尝试在andThen实例上使用String(因为您正在使用clean(txt)调用方法),编译器会将其推断为PartialFunction[Char, ?] 1}}(因为WrappedString继承了继承AbstractSeq[Char])的PartialFunction[Char, A]。这就是你看到类型不匹配的原因。如果要将两者组合在一起,请使用eta-expansion将它们转换为函数类型:

val res = clean _ andThen tokenize
println(res(txt))

函数组合适用于Scala函数,而不是方法(有区别),这就是为什么我们必须先将方法扩展为函数(clean _),然后编译器将能够为我们推断tokenize,而无需手动扩展它。