2016-05-24 11 views
0

ですが、Scalaの新機能です。私はfoorループの順序に関する質問があります。Scala forループの影響の順序は

type Occurrences = List[(Char, Int)] 

lazy val dictionaryByOccurrences: Map[Occurrences, List[Word]] = dictionary.groupBy(x => wordOccurrences(x)) 

def wordAnagrams(word: Word): List[Word] = dictionaryByOccurrences.getOrElse(wordOccurrences(word), List()) 

def combinations(occurrences: Occurrences): List[Occurrences] = occurrences match { 
    case List() => List(List()) 
    case head::tail => { 
    for (o <- combinations(tail); x <- 1 to head._2) 
    yield (head._1, x) :: o 
} 

私はループのために、それは間違っているだろう

def combinations(occurrences: Occurrences): List[Occurrences] = occurrences match { 
    case List() => List(List()) 
    case head::tail => { 
    for (x <- 1 to head._2; o <- combinations(tail)) 
    yield (head._1, x) :: o 
} 

順序を変更する場合、私はfor(x <- xs; y <- ys; ...) yield f(x, y, ...)の型コンストラクタは、デフォルトではxsのと同じである

答えて

1

理由を見つけることができません。返される型がcombinationsの場合はList[Occurrences]、予想される型のコンストラクタはList[_]、型のコンストラクタの場合は1 to nSeq[_]です。

以下のコードは動作:

def combinations(occurrences: Occurrences): List[Occurrences] = occurrences match { 
    case List() => List(List()) 
    case head::tail => { 
    for (x <- (1 to head._2).toList; o <- combinations(tail)) 
    yield (head._1, x) :: o 
} 

そしてこれも動作します:深さ

import collection.breakOut 
def combinations(occurrences: Occurrences): List[Occurrences] = occurrences match { 
    case List() => List(List()) 
    case head::tail => { 
     (for (x <- 1 to head._2; o <- combinations(tail)) 
     yield (head._1, x) :: o)(breakOut) 
    } 
} 

を、for(x <- xs; y <- ys; ...) yield f(...)xs.flatMap(...)に相当し、以下のようList#flatMapの完全な署名:

def flatMap[B, That](f: (A) ⇒ GenTraversableOnce[B]) 
        (implicit bf: CanBuildFrom[List[A], B, That]): That 

あなたは、r eturnタイプflatMapは、のマジックThatです。これはデフォルトでList[B]です。詳細については、Scala 2.8 CanBuildFromを参照してください。

関連する問題