Data.Foldable mostra il seguente tipo di dati algebrico:superiore Kinded Tipi di Scala e Haskell
data Tree a = Empty | Leaf a | Node (Tree a) a (Tree a)
sua kind
è * -> *
. Richiede un tipo a
.
Prelude> :k Tree
Tree :: * -> *
Guardiamo ora al trait Foldable[_]
, un "tipo alto-kinded" da Scala da Functional Programming in Scala:
trait Foldable[F[_]] {
def foldRight[A,B](as: F[A])(z: B)(f: (A,B) => B): B
...
}
L'eccellente libro dice:
Proprio come i valori e le funzioni hanno i tipi , tipi e costruttori di tipi hanno tipi. Scala usa tipi di monitorare il numero di argomenti tipo un costruttore di tipo prende, ...
EDIT
Quando si specifica trait Foldable[F[_]]
, fa il F[_]
indicano sempre un tipo alto-kinded? È possibile che F[_]
sia qualcos'altro? Potrebbe essere un tipo - F[A]
?
Non vedo l'ora di questa risposta. Anch'io sono un po 'confuso dal modo in cui vengono dichiarati i caratteri di tipo superiore in Scala e poi implementati con "istanze" per ogni tipo concreto, e infine utilizzati con un'istanza implicita di tipo superiore. – experquisite