Das ist unmöglich in GHCs vor 8.0, aber the (as of this writing) just-released GHC 8.0.1 add s Unterstützung für custom type errors.
Die Idee ist, dass, genau wie die Funktion error :: String -> a
auf dem Begriff Ebene jede Art mit einem Fehler bewohnt, die wir jetzt haben, in GHC.TypeLits
, die Art Familie
type family TypeError (msg :: ErrorMessage) :: k
, dass jeder Typen mit einem bewohnt Typ Fehler. Der ErrorMessage
Typ ist sehr einfach:
data ErrorMessage = Text Symbol
| ShowType t
| ErrorMessage :<>: ErrorMessage
| ErrorMessage :$$: ErrorMessage
Der Konstruktor (:<>:)
verkettet zwei Fehlermeldungen horizontal; Der (:$$:)
Konstruktor verkettet sie vertikal. Die anderen beiden Konstrukteure tun, was sie sagen.
In Ihrem Beispiel können Sie also den letzten Fall mit einem ausfüllen; zum Beispiel
type family Testf a where
Testf Char = IO()
Testf String = IO()
Testf a = TypeError ( Text "‘Testf’ didn't match"
:$$: Text "when applied to the type ‘"
:<>: ShowType a :<>: Text "’")
Dann versuchen pure()
bei Typ verwenden Testf Int
wird
....hs:19:12: error: …
• ‘Testf’ didn't match
when applied to the type ‘Int’
• In the expression: pure()
In an equation for ‘testfInt’: testfInt = pure()
Compilation failed.
Hinweis mit dem Fehler fehlschlagen, dass während
definiert
testfInt :: Testf Int
testfInt = pure()
korrekt brach, definiert
testfInt :: Testf Int
testfInt = undefined
(oder ähnlich mit testfInt = testfInt
) hat gut funktioniert.
Hier ist eine vollständige Beispiel Quelldatei:
{-# LANGUAGE UndecidableInstances, TypeFamilies, DataKinds, TypeOperators #-}
import GHC.TypeLits
type family Testf a where
Testf Char = IO()
Testf String = IO()
Testf a = TypeError ( Text "‘Testf’ didn't match"
:$$: Text "when applied to the type ‘"
:<>: ShowType a :<>: Text "’")
testfChar :: Testf Char
testfChar = putStrLn "Testf Char"
testfString :: Testf Char
testfString = putStrLn "Testf String"
-- Error here!
testfInt :: Testf Int
testfInt = putStrLn "Int"
GHC 8.0 bietet so etwas wie dies in 'TypeLits', mit spezieller Typ-Checker Unterstützung der Fehler gut aussehen zu lassen. – dfeuer
Guter Fund, zusätzlicher Hinweis darauf. –