我有一堆函数可以清理文本并将它们分成单词。最小的例子:
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 => ?
抱怨这个。
我在这里缺少什么?
答案 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
,而无需手动扩展它。