Haskell 导致某些歧义的上下文中的类型参数

Haskell 导致某些歧义的上下文中的类型参数,haskell,Haskell,对于下面的cadr1,我有以下错误,这是有意义的 无法推断(BoolEq n('such('such n'0))~'True) 从上下文(BoolEq n('such('such n'))~'True) 类型变量“n'0”不明确 我没有在定义站点上使用n',因此它是不明确的 对我来说,有没有存在性地量化这个n',这样ghc就不会试图将它分配给某个类型,并且由于没有任何东西将它与任何东西联系起来而失败 更一般地说,如何控制这些类型变量的范围 编辑:修改以删除布尔类型族为什么不cadr1::fora

对于下面的
cadr1
,我有以下错误,这是有意义的

无法推断(BoolEq n('such('such n'0))~'True)

从上下文(BoolEq n('such('such n'))~'True)

类型变量“n'0”不明确

我没有在定义站点上使用
n'
,因此它是不明确的

对我来说,有没有存在性地量化这个
n'
,这样ghc就不会试图将它分配给某个类型,并且由于没有任何东西将它与任何东西联系起来而失败

更一般地说,如何控制这些类型变量的范围


编辑:修改以删除布尔类型族

为什么不
cadr1::forall a n'。Vec a(Succ(Succ n’)->a
?对于这种特定情况,听起来是一个很好的解决方案。但我想知道是否有方法(通过量化)删除这些名称。在这里,我想把
n'
的范围限定为这段代码。既然我不打算使用它的任何东西,它的存在就是好的。而且它不应该是“模棱两可”的,因为GHC不会试图将其分配给超出其预期的内容scope@chi我将修改这个问题,它是。。模棱两可:)布尔类型族是我在堆栈溢出问题中看到的关于依赖类型Haskell的#1
n~Succ(Succ n')
是一个非常好的约束,并且没有歧义。@BenjaminHodgson:))好的,这是一个爆发。你似乎对BoolEq的案子有一个合理的观点,我试图想出一些简单的方法,我们确实存在歧义,而不是试图找到避免它的方法。
{-# LANGUAGE DataKinds      #-}
{-# LANGUAGE GADTs          #-}
{-# LANGUAGE KindSignatures #-}
{-# LANGUAGE RankNTypes     #-}
{-# LANGUAGE TypeFamilies   #-}

module DecidablePropositionalEquality where


data Nat = Zero | Succ Nat

data Vec :: * -> Nat -> * where
  VNil  :: Vec a Zero
  VCons :: a -> Vec a n -> Vec a (Succ n)

type family Greater (a:: Nat) (b:: Nat) :: Bool where
  Greater Zero Zero = True
  Greater Zero (Succ x) = False
  Greater (Succ x) Zero = True
  Greater (Succ a) (Succ b) = Greater a b

op :: forall a n n'. (Greater n (Succ (Succ n')) ~ True) => Vec a n -> a 
op v = undefined