封闭式家庭的约束

时间:2015-03-19 22:56:48

标签: haskell

我觉得已经有100个这样的问题已被问到,但我无法确定他们的答案:我学习了以下Haskell(7.8.4)技巧:

type family Equal2 (a :: k) (b :: k) :: Bool where
  Equal2 a a = True
  Equal2 a b = False

可以根据是否“a~b”单独编译代码。

是否可以将此技术扩展到其他约束,例如匹配类型类?感觉它接近可能,但并不完全存在。

2 个答案:

答案 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

这是你想到的那种事吗?