我有一堆函数可以清理文本并将它们分成单词。最小的例子:
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
但编译器抱怨这个错误type mismatch; required: Char => ?
在 tokenize 函数中。
我在这里缺少什么?
clean
返回一个String
。你正在尝试使用andThen
on a String
实例(因为您正在调用method with clean(txt)
)并且编译器将其推断为PartialFunction[Char, ?]
(因为WrappedString
继承AbstractSeq[Char]
它继承了PartialFunction[Char, A]
)。这就是您看到类型不匹配的原因。如果您想将两者组合在一起,请使用 eta-expansion 将它们转换为函数类型:
val res = clean _ andThen tokenize
println(res(txt))
函数组合适用于 Scala 函数,不适用于methods(有区别),这就是为什么我们必须首先将方法扩展为函数(clean _
),然后编译器将能够推断tokenize
对于我们来说,无需手动扩展它。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)