在上下文中键入参数会导致一些歧义

时间:2017-06-30 16:25:01

标签: haskell

我对下面的cadr1有以下错误,这是有道理的

  

无法演绎(BoolEq n('Succ('Succ n'0))〜'True)

     

来自上下文(BoolEq n('Succ('Succ n'))〜'True)

     

类型变量'n'0'是不明确的

{-# 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

我没有在定义网站上使用n',所以它不明确。

对我来说,是否存在对此n'的存在量化,以便ghc不会尝试将其分配给某种类型,并且因为没有任何东西与任何东西联系而失败?

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

编辑:已修改为删除布尔类型系列

0 个答案:

没有答案