2012-10-12 16 views
11

W Haskell, przy definiowaniu typu danych można wybrać automatyczne uzyskanie niektórych wystąpień, ale czy mogę odroczyć automatyczne wyprowadzenie, być może nawet umieścić je w innej bibliotece? .Automatyczna instancja wywodząca się z deklaracji

Oto przykład:

Automatyczne uzyskiwanie w Haskell jest oszczędność czasu rzeczywistego!

module MoneyModule where 

data Money = Money Int 
    deriving Show 

Teraz chcę użyć MoneyModule, ale także chcą Read instancję Money:

module ExternalModule where 

instance Read Money where 
    read = error "Can't this be done automatically instead?" 

Ale ja naprawdę wolałbym, aby była ona pochodzi automatycznie, co wiem ghc mógł zrobić, jeśli tylko autor MoneyModule automatycznie wyprowadził instancję Read.


wiem, że:

  • Lepiej rozwiązać problem w rzeczywistej MoneyModule przez łatanie go brakującej instancji.
  • Uważa się, że wystąpienie sierocińca jest złe. Deklaracje instancji są korzystnie umieszczane w module, w którym zdefiniowano typ klasy lub typ danych .

W moim przypadku nie mogę zastosować najlepszych praktyk, ponieważ klasa typu nie jest związana z typem danych. Wątpię, aby moduł klasy typów ani moduł typu danych chciał zatrzymać instancję, dlatego tworzę trzecią bibliotekę, ponieważ w niektórych aplikacjach potrzebujesz deklaracji instancji.

Odpowiedz

14

GHC ma rozszerzenie StandaloneDeriving, z tym, można

{-# LANGUAGE StandaloneDeriving #-} 
import MoneyModule 

deriving instance Read Money 

czerpać instancje dla wielu klas.

4

Aby rozwiązać problem związany z samodzielnym rozwiązaniem, zobacz rozwiązanie daniels. Ale jak wspomniałeś w swoim pytaniu, instancje osierocone nie są najlepszą praktyką, a ghc generuje ostrzeżenia. Aby zaimponować ostrzeżeniom sierot ghc, możesz użyć flagi -fno-warn-orphans. Możesz również dodać go do pliku cabal:

... 
library 
    exposed-modules: ... 
    ... 
    ghc-options: -fno-warn-orphans 
...