Bin ich zu versuchen, meine eigene generische glätten für list-Objekte, welche die CSG-Listen in Scala.
An diesem Punkt habe ich
def myFlatten[T](list: List[List[t]]): List[T] = {
for (xs <- list)
for (x <- xs) yield x
}
Bin ich immer die Meldung:
für xs gefunden Einheit erforderliche Liste.
Sehr nahe! Hier ist eine, die funktioniert:
Oder verwenden Sie den built-in
flatten
Es ist sehr lehrreich zu sehen, wie Sie schreiben, diese Funktion ohne die
for
syntaktischen Zucker.UPDATE
BTW, die Tatsache, dass
List[List[T]]
können abgeflacht werden, umList[T]
ist 50% der Grund, dassList
ist eine Monade. Dies ist im Allgemeinen bekannt alsjoin
. Die anderen 50% resultieren aus der Tatsache, dass Sie können anzeigen eine FunktionA => B
über eineList[A]
zu einerList[B]
. Der Allgemeine name für diese ist eineFunctor map
. fmap und join auf Wikipedia.Einen anderen Weg für die Definition einer Monade für Typ-Konstruktor
M
ist mit einempure
operation, die einen Wert vom TypA
, und gibt einM[A]
; und einebind
Vorgang, bei dem einM[A]
eine FunktionA => M[B]
, und die Ergebnisse inM[B]
. Für Listenpure
==List(_)
, undbind
=(l: List[A], f: (A => List[B])) => l.flatMap(f)
Persönlich, ich mag diesen Stil: