Visualizzazione dei risultati da 1 a 4 su 4
  1. #1
    Utente di HTML.it L'avatar di Nikopol
    Registrato dal
    Jan 2011
    Messaggi
    120

    [Haskell] Definizione di albero binario con elementi "derivati" da Ordering

    Ciao a tutti,
    devo definire una funzione che cerchi un elemento (Int) in un albero binario di ricerca.
    Mi è stato imposto di comparare gli elementi usando la funzione compare di Ordering:
    codice:
    compare :: Ord a => a -> a -> Ordering
    Ho definito l'albero come:
    codice:
    data Tree = Leaf Int
              | Node Tree Int Tree
              deriving (Ordering)
    e la funzione per la ricerca come:
    codice:
    occursT :: Int -> Tree -> Bool
    occursT n (Leaf m) = n `compare` m == EQ
    occursT n (Node t1 m t2)
        | n `compare` m == LT = occursT (t1)
        | n `compare` m == GT = occursT (t2)
        | otherwise = True
    Il problema è che in fase di compilazione, alla riga in cui c'è deriving(Ordering), ottengo questo errore :
    codice:
    Expected kind ‘k0 -> GHC.Prim.Constraint’,
          but ‘Ordering’ has kind ‘*’
        In the data declaration for ‘Tree’
    Sapreste dirmi cosa sbaglio?

    Grazie in anticipo
    Ultima modifica di Nikopol; 23-10-2015 a 23:41
    La Guida Galattica è infallibile.
    È la realtà, spesso, ad essere inesatta.

  2. #2
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590
    Non devi derivare Ordering: non è l'albero ad avere la proprietà di ordinamento, ma l'intero.
    Tu non puoi mettere in ordine 2 alberi:
    (Node (Leaf 1) 3 (Leaf 25)) non è comparabile con (Node (Leaf 1) 7 (Leaf 10))
    1 < 3 < 7 < 10 < 25 gli interi che contengono sono comparabili.

    C'è un altro errore, ma te lo dirà il compilatore dopo aver tolto quel deriving.
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  3. #3
    Utente di HTML.it L'avatar di Nikopol
    Registrato dal
    Jan 2011
    Messaggi
    120
    Ho sistemato così:
    codice:
    data Tree = Leaf Int
              | Node Tree Int Tree
    
    occursT :: Int -> Tree -> Bool
    occursT n (Leaf m) = n `compare` m == EQ
    occursT n (Node t1 m t2)
              | n `compare` m == LT = occursT n t1
              | n `compare` m == GT = occursT n t2
              | otherwise = True
    In effetti guardando meglio la documentazione, Int deriva da Ord il quale definisce compare quindi posso utilizzare compare direttamente su in Int. Io invece pensavo che dovessi specificarlo in qualche modo.

    Grazie mille per l'aiuto
    Ultima modifica di Nikopol; 24-10-2015 a 16:52
    La Guida Galattica è infallibile.
    È la realtà, spesso, ad essere inesatta.

  4. #4
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590
    Di nulla
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.