[英]How can I find out which (concrete) types satisfy a set of typeclass constraints?
給定了一些類型類約束:
{-# 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為我這樣做?
我目前對具體類型感興趣,但是不介意有一個更通用的解決方案,它也可以通過統一的上下文來實現聰明的東西!
社區維基回答基於以下評論:
您可以使用模板haskell執行此操作。
main = print $(reify ''Show >>= stringE . show).
這對於類型同義詞不起作用 - 相反,reify返回表示類型同義詞本身的AST,而不擴展它。 您可以檢查作為約束的類型同義詞,提取該類型同義詞所包含的約束,並繼續對其進行更新。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.