2014-10-29 14 views
10

eine Reihe von Einschränkungen typeclass Gegeben:Wie kann ich herausfinden, welche (konkreten) Typen eine Reihe von Klassenbeschränkungen erfüllen?

{-# LANGUAGE ConstraintKinds, MultiParamTypeClasses #-} 
import Data.Array.Unboxed(Ix,IArray,UArray) 

type IntLike a = (Ord a, Num a, Enum a, Show a, Ix a, IArray UArray a) 

Wie kann ich herausfinden, welche Arten erfüllen IntLike, das heißt alle erwähnten Einschränkungen gemeinsam?

Ich kann die Informationen Puzzle zusammen benötigt vom Ausgang des :info Befehl des GHCI, und dann meine Arbeit Doppelprüf telefonisch unter (oder mit GHCI typecheck)

isIntLike :: IntLike -> Bool 
isIntLike = const True 

bei verschiedenen Arten, z.B. .

Gibt es eine Möglichkeit, ghci dazu zu bringen, das für mich zu tun?

Ich bin derzeit an konkreten Typen interessiert, hätte aber nichts dagegen, eine allgemeinere Lösung zu haben, die auch clevere Sachen mit vereinheitlichenden Kontexten macht!

+1

Sie können dies mit Vorlage haskell tun: 'main = print $ (" "Show >> = stringE. Show)". Dies funktioniert bei Typ-Synonymen nicht - stattdessen gibt REIFY den AST zurück, der das Typ-Synonym selbst darstellt, ohne es zu erweitern. Sie können nach Typ-Synonymen suchen, bei denen es sich um Constraints handelt, die Constraints, aus denen der Typ Synonym besteht, extrahieren und diese '' weiter vereinheitlichen. – user2407038

+0

Richtig, das scheint alle Informationen zu enthalten, die ich brauche, um die Kreuzung zu nehmen, danke! Ich werde, was ich kann, aber ich muss sagen, dass Hacking GHCi scheint fast praktischer :-) – yatima2975

+0

@ user2407038 können Sie diesen Kommentar in eine Antwort zu verwandeln, wie ich tseems auf die Frage geantwortet habe? – sclv

Antwort

1

Community Wiki Antwort auf Grundlage der Kommentare:

Sie können diese mit Vorlage Haskell tun.

main = print $(reify ''Show >>= stringE . show). 

Dies wird nicht für Typ Synonyme arbeiten - besser gesagt, verdinglichen kehrt die AST den Typ Synonym darstellt selbst, ohne es zu erweitern. Sie können nach Synonymen suchen, bei denen es sich um Constraints handelt, die Constraints, aus denen der Typ Synonym besteht, extrahieren und mit der weiteren Vereinheitlichung fortführen.

+0

Es ist erwähnenswert, dass dies nur in GHCi mit '-XTemplateHaskell' bei der Verwendung von' $ (Language.Haskell.TH.Syntax.reify '' Show >> = Language.Haskell.TH.Lib.stringE. Show) 'gemacht werden kann – Alec