解决依赖约束的类的约束

时间:2019-06-29 16:44:41

标签: haskell ghc gadt

我正在使用ConstraintKindsMultiParamTypeClasses来获取由另一个类参数化的类。

假设Foo m指出了指向约束m的类型,即(m a) => a。因此,我尝试使用它来构造一些Bar m

{-# LANGUAGE AllowAmbiguousTypes   #-}
{-# LANGUAGE ConstraintKinds       #-}
{-# LANGUAGE FlexibleInstances     #-}
{-# LANGUAGE GADTs                 #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE RankNTypes            #-}
{-# LANGUAGE ScopedTypeVariables   #-}
{-# LANGUAGE TypeOperators         #-}

class Foo m where
  foo :: (m a) => a

data Bar m where
  Bar :: ((m a) => a) -> Bar m

bar :: Foo m => Bar m
bar = Bar foo

但是出现以下错误。

Could not deduce (Foo m0) arising from a use of ‘foo’
      from the context: Foo m

从上下文来看,m0应该是m。有没有办法使这项工作?


我认为现在的问题是,我可以先定义一些Foo Pointed a,然后定义一些Foo Pointed2 a,在这种情况下,foo将不知道返回什么,对吗?我的想法是,我将调用(bar :: Bar Pointed)(bar :: Bar Pointed2)并得到两个不同的结果。这样的事情可能吗?为什么不呢?

1 个答案:

答案 0 :(得分:2)

您似乎可以使用类型应用程序执行此操作,以帮助GHC找出您在谈论的约束:

bar :: forall m . (Foo m) => Bar m
bar = Bar (foo @m)