在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
答案 0 :(得分:5)
您需要开启UndecideableInstances
。此扩展提升了一系列限制,其存在确保编译将始终终止。其中一个与类型系列有关。在第一个示例中,RHS上的外部术语是实际类型,而不是对类型函数的另一个调用。另一方面,在您的第二个示例中,RHS完全是对类型函数(+)
的调用(不要与同名的值级别函数混淆)。
GHC抱怨因为它无法告诉你所写的内容会终止。事实上,它的微小变化并不是:
type family Length (l :: [*]) :: Nat where
Length '[] = 0
Length (a ': as) = 1 + Length (a ': as)