2017-02-19 15 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を返します。あなたは(あなたがclean(txt)方法を呼び出しているので)Stringインスタンス上andThenを使用しようとしていると(WrappedStringPartialFunction[Char, A]を継承AbstractSeq[Char]を継承するため)コンパイラがPartialFunction[Char, ?]としてそれを推測します。そういうわけで、型の不一致が見えているのです。あなたが一緒に2を構成したい場合は、ETA-拡張を使用して関数型に変える:

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

機能組成物はない方法(区別がある)、Scalaの機能に動作し、我々が持っている理由ですメソッドを最初に関数(clean _)に展開すると、コンパイラは手動で展開することなくtokenizeを推論することができます。

+1

興味深い、私はそれを得る。エタ拡張について知らなかった。私はいくつかの読書があります:)。 – Tim

関連する問題