非法嵌套类型系列应用程序(使用UndecidableInstances允许此操作)

时间:2016-09-18 16:30:15

标签: haskell

在GHC 8.0.1中,我试图为类型级列表实现类型级Import-Csv 'C:\path\to\your.csv' | Group-Object ErrorID, Date | Select-Object @{n='ErrorID';e={$_.Group[0].ErrorID}}, @{n='Date';e={$_.Group[0].Date}}, Count 函数。它编译:

Length

但如果我使用{-# LANGUAGE DataKinds, TypeOperators, TypeFamilies #-} data Nat = Z | S Nat type family Length (l :: [*]) :: Nat where Length '[] = Z Length (_ ': as) = S (Length as) ,它就不会编译:

TypeLits

编译器出现以下错误:

import GHC.TypeLits

type family Length (l :: [*]) :: Nat where
    Length '[] = 0
    Length (_ ': as) = 1 + Length as

1 个答案:

答案 0 :(得分:5)

您需要开启UndecideableInstances。此扩展提升了一系列限制,其存在确保编译将始终终止。其中一个与类型系列有关。在第一个示例中,RHS上的外部术语是实际类型,而不是对类型函数的另一个调用。另一方面,在您的第二个示例中,RHS完全是对类型函数(+)的调用(不要与同名的值级别函数混淆)。

GHC抱怨因为它无法告诉你所写的内容会终止。事实上,它的微小变化并不是:

type family Length (l :: [*]) :: Nat where
    Length '[] = 0
    Length (a ': as) = 1 + Length (a ': as)