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

Haskell 如何找出哪些(具体的)类型满足一组类型类约束?,haskell,typeclass,ghci,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命令的输出中拼凑出所需的信息,然后通过调用

给定许多类型类约束:

{-# 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(3::Int)

有没有办法让ghci帮我做这件事


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

基于评论的社区Wiki答案:


您可以使用模板haskell来实现这一点

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

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

您可以使用模板haskell:
main=print$(具体化“Show>=stringE.Show)
来完成此操作。这对类型同义词不起作用-相反,reify返回表示类型同义词本身的AST,而不展开它。您可以检查作为约束的类型同义词,提取该类型同义词所包含的约束,然后继续
具体化这些约束。好的,这似乎包含了我进行交叉所需的所有信息,谢谢!我会尽我所能,但我必须说,黑客攻击GHCi似乎更为实际:-)@user2407038当我试图回答qeustion时,你能把这个评论变成一个答案吗?值得指出的是,这可以在GHCi中通过
-XTemplateHaskell
使用
$(Language.Haskell.TH.Syntax.reify“Show>>=Language.Haskell.TH.Lib.stringE.Show)
main = print $(reify ''Show >>= stringE . show).