data Binary = 0 | 1
是不正常的定义数据类型的形式。 data
定义需要数据构造函数和0
和1
对于它们来说不是合法语法,因为它们已经用于数字文字。这是第二条错误消息试图告诉你的,并且是基本的Haskell。对于数据构造最常见的语法是一个大写的话,那么你可能想要的东西更像
data Binary = Zero | One
注意:此消息的其余部分是先进的东西,你可能不需要,但我觉得解释关于你为什么得到第一个关于-XDataKinds
的错误消息。
随着DataKinds
延伸,0
和1
做了别样的成为合法的“类型”(被称为Nat
,而事实上“厚道”是这里的技术术语),用于高级型级别的编程,并与还有几个扩展它是可能获得包含它们的数据定义。
请注意,下面的例子可能不是真的有用,我只是拼凑在一起,以显示它是可能的。在实践中,除非你在做相当先进的东西,data Binary = Zero | One
可能更像你想要的。
{-# LANGUAGE DataKinds, KindSignatures #-}
import GHC.TypeLits (Nat)
data Proxy (n :: Nat) = Proxy
data WeirdBinary = Zero (Proxy 0) | One (Proxy 1)
我还没有真正能够使工作(虽然我只尝试了一会儿)是什么,开始data Binary = 0
。我得到的最接近像
class (n :: Nat) /// a where
data Binary = (0 /// Bool) => ThisIsSilly
奇怪的东西,其中0
仍需要在括号内。我想逻辑上这种特殊的形式应该没有括号的工作,但它不。
鉴于此,我认为Haskell正在被不必要地混淆,因为暗示有一些方法可以使扩展符合0
。然而,使用分析和类型/类型检查的方式在GHC中是分开的阶段,以更加用户友好的方式来捕捉它可能过于复杂,甚至最终可能意味着未来有效。