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

yat*_*975 10 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)
Run Code Online (Sandbox Code Playgroud)

我怎样才能找出哪些类型的满足IntLike,即所有上述约束联合?

我可以把ghci :info命令输出所需的信息拼凑起来,然后通过调用(或者使用ghci typecheck)来重复检查我的工作

isIntLike :: IntLike -> Bool
isIntLike = const True
Run Code Online (Sandbox Code Playgroud)

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

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

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

scl*_*clv 1

社区 Wiki 基于评论的回答:

您可以使用模板 haskell 来完成此操作。

main = print $(reify ''Show >>= stringE . show).
Run Code Online (Sandbox Code Playgroud)

这不适用于类型同义词 - 相反,reify 返回表示类型同义词本身的 AST,而不扩展它。您可以检查作为约束的类型同义词,提取该类型同义词所包含的约束,然后继续具体化这些约束。