我可以在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抱怨a
和b
不在RHS上。它似乎也不喜欢forall
。
这可能看起来像一个愚蠢的例子,对于类的不同实例可能存在不同的约束,因此这种迂回方案。由于约束会影响并依赖于类中方法的参数,因此我不能将它们放在实例头中。
答案 0 :(得分:0)
我认为这里的平等约束在这种形式上并没有真正意义。 ~
应该有类似k -> k -> Constraint
的排序,因此在该上下文中t
需要在左侧有Constraint
种类,而在右侧则需要以*
结束a
...
但是,如果我已正确理解问题,您需要具有b
和data 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>
使您可以恢复约束和基础类型。