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的#1n~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