2012-04-11 11 views
6

Zadanie: Próbuję utworzyć niestandardowy typ danych i mieć możliwość drukowania na konsoli. Chcę też móc go sortować za pomocą naturalnego porządku Haskella.Mylić o niestandardowych typach danych w Haskell

Problem: Napisz teraz, nie mogę skompilować tego kodu. Zgłasza następujący błąd: No instance for (Show Person) arising from a use of 'print'.

Co mam tak daleko:

-- Omitted working selection-sort function 

selection_sort_ord :: (Ord a) => [a] -> [a] 
selection_sort_ord xs = selection_sort (<) xs 

data Person = Person { 
    first_name :: String, 
    last_name :: String, 
    age :: Int }    

main :: IO() 
main = print $ print_person (Person "Paul" "Bouchon" 21) 

Odpowiedz

8

Musisz instancję Show przekonwertować typ do druku reprezentacji (a String). Najłatwiejszym sposobem uzyskania tego jest dodanie definicji typu do tej definicji. Aby uzyskać najczęściej potrzebne wystąpienia, należy uzyskać

.

Jeśli chcesz inny Ord instancji, jak zasugerowano w komentarzach, zamiast wyprowadzania że (zachować wynikające Eq i Show chyba że chcesz inny problem dla tych), zapewniają instancję jak

instance Ord Person where 
    compare p1 p2 = case compare (age p1) (age p2) of 
         EQ -> case compare (last_name p1) (last_name p2) of 
           EQ -> compare (first_name p1) (first_name p2) 
           other -> other 
         unequal -> unequal 

lub użytkowania pasujące do wzorca w definicji compare jeśli wolisz,

compare (Person first1 last1 age1) (Person first2 last2 age2) = 
     case compare age1 age2 of 
      EQ -> case compare last1 last2 of 
        EQ -> compare first1 first2 
        other -> other 
      unequal -> unequal 

dla porównania w zależności od wieku, potem nazwisko, i wreszcie, jeśli to konieczne, imię.

+0

Fajnie, dziękuję. Więc Eq i Ord pozwolą Osobom na sortowanie w sposób naturalny? –

+1

Yup, z instancją 'Ord' (która wymaga' Eq'), standardowe sortowanie 'z' Data.List' jest dostępne do sortowania. –

+0

A jeśli chciałem użyć 'selection_sort_ord' (powyżej), aby posortować listę pozycji danej osoby w kolejności rosnącego wieku, używając słowa kluczowego" instance ", aby napisać własną funkcję" porównywania ", wszelkie sugestie dotyczące tego, w jaki sposób bym to zrobił to? –