我觉得已经有100个这样的问题已被问到,但我无法确定他们的答案:我学习了以下Haskell(7.8.4)技巧:
type family Equal2 (a :: k) (b :: k) :: Bool where
Equal2 a a = True
Equal2 a b = False
可以根据是否“a~b”单独编译代码。
是否可以将此技术扩展到其他约束,例如匹配类型类?感觉它接近可能,但并不完全存在。
答案 0 :(得分:4)
假设您的意思是用a ~ b
之类的内容替换Ord a
:
不,这是不可能的,因为虽然Haskell可以测试数据类型是否相等,但它没有类型类中明确不的数据类型的概念 - 您始终可以在另一个不知道的模块中添加实例。这被称为“开放世界的假设”。
答案 1 :(得分:1)
使用ConstraintKinds,您可以从类型计算约束,这个愚蠢的例子显示:
{-# LANGUAGE ConstraintKinds #-}
{-# LANGUAGE PolyKinds #-}
{-# LANGUAGE TypeFamilies #-}
import GHC.Exts (Constraint)
type family CustomConstraint (a :: k) (b :: k) :: Constraint where
CustomConstraint a a = Show a
CustomConstraint a b = ()
data Unshowable = MkUnshowable
f :: (CustomConstraint a b) => a -> b -> ()
f _ _ = ()
-- Well-typed, because the constraint is ()
x = f True MkUnshowable
-- Ill-typed, because the constraint is Show Unshowable
y = f MkUnshowable MkUnshowable
这是你想到的那种事吗?