2015-09-21 1 views
5

Per un incarico per la mia classe di programmazione funzionale sto lavorando a un esercizio sugli alberi. E più specificamente sugli alberi di rose. Nel framework che abbiamo ottenuto il tipo di dati 'Rose' è già definito, ma ha un operatore:>. L'ho cercato su hoogle e ho detto che è l'elemento più a destra di una sequenza e il resto della sequenza. (Parte del quadro di seguito)Haskell Strange Operator

data Rose a = a :> [Rose a] 
deriving (Eq, Show) 

-- Exercise 1 

root :: Rose a -> a 
root = undefined 

children :: Rose a -> [Rose a] 
children = undefined 

ho affatto bisogno di voi ragazzi a dirmi come la funzione radice e bambini dovrebbe essere fatto. Ma se voi ragazzi poteste darmi qualche consiglio su come leggere la riga "dati Rose a" o magari mostrarmi come si costruisce un albero di rose. Queste cose sarebbero di grande aiuto, mi diverto a fare gli esercizi.

Spero che qualcuno possa indicarmi la giusta direzione.

risposta

9

di t molto simile alla definizione di un elenco:

  • (:>) è un po 'come (:)
  • data Rose a = a :> [Rose a] ti dice, che è possibile ottenere un t :: Rose a
    • con un elemento x :: a
    • e bambini rs :: [Rose a]
    • da t = x :> rs

, naturalmente, si può tornare gli elementi di questo tipo anche:

root (x :> rs) = ... 

Mi auguro che si ottiene il resto da soli;)

+1

Grazie, un grande aiuto. Sì, ho ottenuto le funzioni di root e dei bambini adesso. – mcNuggetsplays

9

L'operatore :> è in realtà un costruttore di dati. Sarebbe equivalente definire il tipo

data Rose a = Node a [Rose a] 

Dove (:>) = Node. Quindi, con questa definizione alternativa si avrebbe

root :: Rose a -> a 
root (Node a subnodes) = a 

Sostituendo per il costruttore reale :> si avrebbe

root ((:>) a subnodes) = a 

che può anche essere scritta come

root (a :> subnodes) = a 

Come @Carsten dice che è solo come il costruttore di liste :, specializzato solo per il tipo di dati Rose.

6

L'operatore :> non ha un significato predefinito. È introdotto da la tua definizione Rose, proprio come l'identificatore Rose. In Haskell puoi definire i tuoi operatori, questo è uno di questi.

Questo particolare operatore è un costruttore di dati, che può essere determinato dal primo carattere. I costruttori di dati iniziano con due punti. Gli operatori che non iniziano con i due punti sono funzioni normali.

Funziona esattamente come qualsiasi altro costruttore di dati, l'unica differenza è che è scritto in forma infissa, come :. In questo programma, può essere letto come "allegato a".

Dal momento che tutti possono utilizzarlo nel proprio programma per qualsiasi scopo, è inutile google.