给出了一些类型类约束:
{-# 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为我这样做?
我目前对具体的类型感兴趣,但是不介意有一个更通用的解决方案,它也可以用统一的上下文做聪明的事情!
答案 0 :(得分:1)
基于评论的社区Wiki答案:
您可以使用模板haskell执行此操作。
main = print $(reify ''Show >>= stringE . show).
这对于类型同义词不起作用 - 相反,reify返回表示类型同义词本身的AST,而不扩展它。您可以检查作为约束的类型同义词,提取该类型同义词所包含的约束,并继续对其进行更新。