什么是错误信息"宇宙不一致"在使用更高级别的类型时意味着什么?

时间:2015-11-12 08:57:04

标签: idris higher-rank-types

鉴于以下Idris代码:

import Data.Vect
import Data.Fin

%default total

fins : Vect n (Fin n)
fins {n = Z} = []
fins {n = S n} = FZ :: map FS fins

Permutation : Nat -> Type
Permutation n = {a : Type} -> Vect n a -> Vect n a

permutations : {n : Nat} -> Vect (fact n) (Permutation n)
permutations {n = Z} = [id]
permutations {n = S n} =
    rewrite multCommutative (S n) (fact n) in
    concat $ map inserts (permutations {n = n})
  where
    inserts : Permutation k -> Vect (S k) (Permutation (S k))
    inserts pi = map (\i => \(x :: xs) => insertAt i x . pi $ xs) fins

我从Idris 0.9.16收到以下错误消息(并且没有进一步的细节):

Type checking .\Permutations.idr
Permutations.idr:15:14:Universe inconsistency

然而,通过稍微改变它,以便permutations的第二个子句变为

permutations {n = S n} =
    rewrite multCommutative (S n) (fact n) in
    concat . map inserts $ permutations {n = n}
然后突然间出现了问题。

在Idris内部是否有一些特殊的魔法可能在处理($)(.)similar to what GHC does以便它们在更高等级类型的存在下工作?

1 个答案:

答案 0 :(得分:0)

从Idris 0.10.2开始,我的原始代码(在concat $ map inserts (permutations {n = n})的定义中使用permutations)没有打嗝的类型检查。