2014-10-29 8 views
10

Dato un certo numero di vincoli typeclass:Come posso scoprire quali tipi (concreti) soddisfano un insieme di vincoli di classe di caratteri?

{-# 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) 

Come posso sapere quali tipi soddisfano IntLike, vale a dire tutti i vincoli di cui congiuntamente?

posso puzzle insieme le informazioni necessarie dall'output del comando di ghci :info, e quindi ricontrollate il mio lavoro chiamando il numero (o avere ghci TYPECHECK)

isIntLike :: IntLike -> Bool 
isIntLike = const True 

a vari tipi, per esempio .

C'è un modo per ottenere ghci per fare questo per me?

Attualmente mi interessano i tipi concreti, ma non mi dispiacerebbe avere una soluzione più generale che faccia anche cose intelligenti con contesti unificanti!

+1

È possibile farlo utilizzando il modello haskell: 'main = print $ (reify '' Show >> = stringE. Show)'. Questo non funzionerà per i sinonimi di tipo - piuttosto, reify restituisce l'AST che rappresenta il sinonimo di tipo stesso, senza espanderlo. Puoi controllare i sinonimi di tipo che sono vincoli, estrarre i vincoli di cui quel sinonimo di tipo consiste e continuare a reimpostarli. – user2407038

+0

Esatto, sembra che contenga tutte le informazioni necessarie per prendere l'incrocio, grazie! Sarò quello che posso sferzare, ma devo dire che hacking GHCi sembra quasi più pratico :-) – yatima2975

+0

@ user2407038 puoi trasformare quel commento in una risposta come ho dovuto rispondere alla qeustion? – sclv

risposta

1

Wiki risposta sulla base dei commenti:

È possibile farlo utilizzando il modello Haskell.

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

Questo non funziona per i sinonimi tipo - piuttosto, reificare restituisce l'AST che rappresenta il tipo sinonimo stesso, senza espansione esso. Puoi controllare i sinonimi di tipo che sono vincoli, estrarre i vincoli di cui quel sinonimo di tipo consiste e continuare a reimpostarli.

+0

Vale la pena sottolineare che questo può essere fatto solo in GHCi con '-XTemplateHaskell' sull'uso di' $ (Language.Haskell.TH.Syntax.reify '' Show >> = Language.Haskell.TH.Lib.stringE. Show) ' – Alec