2016-04-20 24 views
12

Sto cercando di capire come utilizzare i tipi di dati algebrici in Kotlin, quindi sto cercando di implementare un tipo BinaryTree di base nel seguente modo.Tipi di dati algebrici in Kotlin

sealed class Tree<T>{ 
    class Node<T>(val left: Tree<T>, val right: Tree<T>): Tree<T>() 
    class Leaf<T>(val value: T): Tree<T>() 
} 

Questo è tutto bene, e mi permette di costruire la seguente struttura:

val myTree1: Tree<Int> = Node(Leaf(4), Leaf(2)) 

Comunque mi piacerebbe avere un tipo di "vuoto", così, così posso esprimere quanto segue:

val myTree1: Tree<Int> = Node(Node(Leaf(4), Leaf(3)), Empty) 

ho provato la seguente:

sealed class Tree<T>{ 
    class Node<T>(val left: Tree<T>, val right: Tree<T>): Tree<T>() 
    class Leaf<T>(val value: T): Tree<T>() 
    object Empty: Tree() 
} 

Anche se ottengo l'errore che l'argomento Type è previsto per l'oggetto Empty: Tree(), che in realtà è abbastanza logico.

ho cercato

object Empty: Tree<T>() 

Ma è portato in "riferimento non risolto: T". Come ultima risorsa, ho provato a scrivere

object Empty<T>: Tree<T>() 

Ma il compilatore dice "parametri di tipo non sono ammessi per gli oggetti"

C'è un modo per esprimere questo Kotlin? Vuoto dovrebbe essere un singleton, questo è il motivo per cui dovrebbe essere un oggetto. Rendendolo una classe, risolve i problemi del compilatore, ma poi devo mettere le parentesi dopo di esso come = = Empty(). Inoltre, crea oggetti non necessari, mentre dovrebbe essere davvero un valore singleton.

Apprezzerei qualsiasi aiuto su questo problema. :)

risposta

14

Per prima cosa è necessario impostare il parametro T e out. Quindi è possibile utilizzare Nothing come argomento di tipo per Empty.

sealed class Tree<out T>{ 
    class Node<T>(val left: Tree<T>, val right: Tree<T>): Tree<T>() 
    class Leaf<T>(val value: T): Tree<T>() 
    object Empty: Tree<Nothing>() 
} 

Nothing è un tipo speciale Kotlin, che non può avere un'istanza ed è un sottotipo di tutti gli altri tipi. Quindi direi che è opposto a Any nella gerarchia di tipi di Kotlin.

+2

Funziona, grazie! Inoltre, ho imparato qualcosa anche sul Nulla. :) – pjozsef

+0

qui non hai bisogno di 'out' qui - funziona senza di esso. Si prega di chiarire che – voddan

+2

@voddan se si rimuove 'out' diventerà impossibile creare un' Node' con un 'Leaf' e' Empty'. – Michael

Problemi correlati