使用通用约束种类

时间:2016-02-14 11:57:45

标签: haskell typeclass

我可以在Haskell中完全有效地编写这样的类型:

(t ~ (a, b)) => t

以迂回的方式说t是一对。

但是我想说我想这样做:

type family MyConstraint t :: Constraint

data PairConstraintParam

type instance MyConstraint PairConstraintParam = ...

(t ~ MyConstraint PairConstraintParam) => t

我可以在type instance MyConstraint PairConstraintParam =

之后放置什么

我尝试(a,b),但GHC抱怨ab不在RHS上。它似乎也不喜欢forall

这可能看起来像一个愚蠢的例子,对于类的不同实例可能存在不同的约束,因此这种迂回方案。由于约束会影响并依赖于类中方法的参数,因此我不能将它们放在实例头中。

1 个答案:

答案 0 :(得分:0)

我认为这里的平等约束在这种形式上并没有真正意义。 ~应该有类似k -> k -> Constraint的排序,因此在该上下文中t需要在左侧有Constraint种类,而在右侧则需要以*结束a ...

但是,如果我已正确理解问题,您需要具有bdata PairConstraintParam data ExistentialPair :: * where Exists :: (a, b) -> ExistentialPair type family MyConstraint (p :: *) (t :: *) :: Constraint where MyConstraint PairConstraintParam t = t ~ ExistentialPair test :: (MyConstraint PairConstraintParam t) => t test = Exists (1, "hi") 的存在类型;也许这就是你想要的:

a, b

意味着"存在t ~ (a, b),这样data ConstraintVariant = PairConstraint class IsPair p where instance IsPair (a, b) type family ConstrainedBy (c :: ConstraintVariant) :: * -> Constraint where ConstrainedBy PairConstraint = IsPair data Thing c t where Thing :: (c t) => t -> Thing c t test2 :: Thing (ConstrainedBy PairConstraint) (Int, String) test2 = Thing (1, "hi") " (直到同构)。当然,您可能希望添加更多约束来实际执行有用的操作。

我能想到的另一个变体如下:

<script type="text/javascript">
    $(document).ready(function() {
        $('#play').on('click',function(){
            $("#Audio1")[0].play();
        });
        $('#play')[0].click();//initial click on 'play' button to play music which doesn't seem to be working...

    });
</script>

使您可以恢复约束和基础类型。