如何找出哪些(具体)类型满足一组类型类约束?

时间:2014-10-29 08:23:38

标签: haskell typeclass ghci

给出了一些类型类约束:

{-# 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 typecheck)来重复检查我的工作

isIntLike :: IntLike -> Bool
isIntLike = const True

各种类型,例如isIntLike (3::Int)

有没有办法让ghci为我这样做?

我目前对具体的类型感兴趣,但是不介意有一个更通用的解决方案,它也可以用统一的上下文做聪明的事情!

1 个答案:

答案 0 :(得分:1)

基于评论的社区Wiki答案:

您可以使用模板haskell执行此操作。

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

这对于类型同义词不起作用 - 相反,reify返回表示类型同义词本身的AST,而不扩展它。您可以检查作为约束的类型同义词,提取该类型同义词所包含的约束,并继续对其进行更新。