2017-02-19 84 views
2

我有一堆函數清理文本並將它們分成單詞。最小示例:斯卡拉鍊函數與和類型不匹配

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 => ?

我在這裏錯過了什麼?

回答

2

clean返回String。你試圖在String實例使用andThen(因爲你調用方法clean(txt))和編譯器推斷它作爲PartialFunction[Char, ?](因爲WrappedString繼承AbstractSeq[Char]它繼承PartialFunction[Char, A])。這就是爲什麼你看到類型不匹配。如果你想撰寫兩者結合起來,採用ETA-擴大把它們變成功能類型:

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

功能組合工作方式上Scala的功能,而不是方法(有區別),這就是爲什麼我們有首先將該方法擴展爲函數(clean _),然後編譯器將能夠爲我們推斷tokenize,而無需手動擴展它。

+1

有趣,我明白了。不知道eta擴展。我有一些閱讀要做:)。 – Tim

相關問題