2014-10-29 59 views
10

賦予了許多類型類的約束:如何找出哪些(具體)類型滿足一組類型約束?

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

我如何可以找出哪些類型滿足IntLike,即所有上述約束聯合

我可以在各種類型的,例如砌起來從ghci中的:info命令的輸出所需要的信息,然後通過調用(或具有ghci的類型檢測)雙檢我的工作

isIntLike :: IntLike -> Bool 
isIntLike = const True 

有沒有辦法讓ghci爲我做這件事?

我目前對混凝土類型感興趣,但並不介意有一個更一般的解決方案,它也可以用統一的上下文來做聰明的事情!

+1

你可以使用模板haskell來做到這一點:'main = print $(reify''Show >> = stringE。show)'。這不適用於類型同義詞 - 相反,reify返回代表類型同義詞本身的AST,而不擴展它。您可以檢查是約束的類型同義詞,提取該類型同義詞所包含的約束條件,並繼續進行這些約定。 – user2407038 2014-10-30 06:54:51

+0

對,這似乎包含我需要去交點的所有信息,謝謝!我會盡我所能,但我不得不說,黑客GHCi似乎更實際:-) – yatima2975 2014-10-31 01:20:30

+0

@ user2407038你可以把這個評論變成一個答案,因爲我認爲已經回答了qeustion? – sclv 2015-02-20 04:24:03

回答

1

社區Wiki根據意見回答:

您可以使用模板haskell來做到這一點。

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

這不適用於類型同義詞 - 相反,reify返回表示類型同義詞本身的AST,而不展開它。您可以檢查作爲約束的類型同義詞,提取該類型同義詞所包含的約束,並繼續對其進行重新化。

+0

值得指出的是,只需在GHCi中使用'$(Language.Haskell.TH.Syntax.reify'Show * = Language.Haskell.TH.Lib.stringE。show)'-XTemplateHaskell'就可以做到這一點。 – Alec 2016-12-06 05:26:42