4

私は Scala が初めてで、いくつかの scala 構文を理解しようとしています。

だから私は文字列のリストを持っています。

wordList: List[String] = List("this", "is", "a", "test")

単語ごとの子音と母音の数を含むペアのリストを返す関数があります。

def countFunction(words: List[String]): List[(String, Int)]

たとえば、次のようになります。

countFunction(List("test")) => List(('Consonants', 3), ('Vowels', 1))

ここで、単語のリストを取得し、署名の数でグループ化します。

def mapFunction(words: List[String]): Map[List[(String, Int)], List[String]]

//using wordList from above
mapFunction(wordList) => List(('Consonants', 3), ('Vowels', 1)) -> Seq("this", "test")
                         List(('Consonants', 1), ('Vowels', 1)) -> Seq("is")
                         List(('Consonants', 0), ('Vowels', 1)) -> Seq("a")

これを行うには GroupBy を使用する必要があると考えています:

def mapFunction(words: List[String]): Map[List[(String, Int)], List[String]] = { 
    words.groupBy(F: (A) => K)
}

Map.GroupBy の scala api を読んだところ、F は識別子関数を表し、K は返されるキーのタイプであることがわかりました。だから私はこれを試しました:

    words.groupBy(countFunction => List[(String, Int)]

しかし、scala はこの構文を好みません。groupBy の例をいくつか調べてみましたが、私のユースケースでは何も役に立たないようです。何か案は?

4

2 に答える 2

7

説明に基づいて、カウント関数は単語のリストではなく単語を取る必要があります。私はそれを次のように定義したでしょう:

def countFunction(words: String): List[(String, Int)]

これを行うと、 を呼び出すことができるはずですwords.groupBy(countFunction)。これは次と同じです。

words.groupBy(word => countFunction(word))

の署名を変更できない場合はcountFunction、次のように group by を呼び出すことができるはずです。

words.groupBy(word => countFunction(List(word)))
于 2012-10-25T02:42:12.660 に答える
0

関数の戻り値の型を呼び出しに入れるべきではありません。コンパイラはこれを自分で把握できます。次のように呼び出すだけです。

words.groupBy(countFunction)

countFunctionそれでもうまくいかない場合は、実装を投稿してください。

アップデート:

countFunction私は REPL でそれをテストしましたが、これは機能します (私の署名はあなたの署名とは少し異なることに注意してください):

scala> def isVowel(c: Char) = "aeiou".contains(c)
isVowel: (c: Char)Boolean

scala> def isConsonant(c: Char) = ! isVowel(c)
isConsonant: (c: Char)Boolean

scala> def countFunction(s: String) = (('Consonants, s count isConsonant), ('Vowels, s count isVowel))
countFunction: (s: String)((Symbol, Int), (Symbol, Int))

scala> List("this", "is", "a", "test").groupBy(countFunction)
res1: scala.collection.immutable.Map[((Symbol, Int), (Symbol, Int)),List[java.lang.String]] = Map((('Consonants,0),('Vowels,1)) -> List(a), (('Consonants,1),('Vowels,1)) -> List(is), (('Consonants,3),('Vowels,1)) -> List(this, test))

に渡される関数の型を含めることができgroupByますが、私が言ったように、それは必要ありません。渡したい場合は、次のようにします。

words.groupBy(countFunction: String => ((Symbol, Int), (Symbol, Int)))
于 2012-10-25T01:34:32.557 に答える