Haskell,我如何构造一个新的数据类型,使该类型的值为1、2或3?

Haskell,我如何构造一个新的数据类型,使该类型的值为1、2或3?,haskell,Haskell,我想构造一个名为Oct的新数据类型,它应该返回1、2或3,因此我的代码如下: 数据Oct=1 | 2 | 3 但是Haskell显示了如下错误:无法在data/newtype声明中解析数据构造函数:1 我不知道这个错误意味着什么。我该如何修复它呢?你真的不能创建这样的任意子类型。您可以使用三个构造函数创建一个数据类型,您只需了解有关数据声明的一些内容: 当您声明一个新的数据类型时,您将使用它的构造函数来声明它。您使用的构造函数是全新的名称,没有任何意义。数据类型及其构造函数都必须以大写字母开头。

我想构造一个名为Oct的新数据类型,它应该返回1、2或3,因此我的代码如下: 数据Oct=1 | 2 | 3

但是Haskell显示了如下错误:无法在data/newtype声明中解析数据构造函数:1


我不知道这个错误意味着什么。我该如何修复它呢?

你真的不能创建这样的任意子类型。您可以使用三个构造函数创建一个数据类型,您只需了解有关数据声明的一些内容:

当您声明一个新的数据类型时,您将使用它的构造函数来声明它。您使用的构造函数是全新的名称,没有任何意义。数据类型及其构造函数都必须以大写字母开头。你这么说

data Oct = One | Two | Three
这将声明类型
Oct
和三个值
One
Two
,以及
three
——一次声明四个

另一种选择是将

newtype Oct = Oct Int
如@Nawaz的答案所示

有一种方法可以使数值文本工作,因此您可以使用
1::Oct
,但在这种情况下,这并不好,因为(库的设计方式)数值文本也应该带有数值结构,而
Oct
没有这种结构(好吧,除非您想开始做花哨的数学)。同样使用
4::Oct
会进行打字检查,但这是一个运行时错误,我们也不喜欢

但是Haskell显示了如下错误:无法在data/newtype声明中解析数据构造函数:1


此错误消息告诉您,
1
不是数据构造函数的有效名称。数据构造函数的名称规则与大多数语言中变量的名称规则相似。在这里,编译器会抱怨,因为名称以数字开头,这是不允许的。

我想您应该将
Int
的值限制为
{1,2,3}
中的一个。如果是,您可以将新类型的
Oct
定义为:

newtype Oct = Oct Int deriving(Show)
oct :: Int -> Oct
oct n 
   | n > 0 && n < 4 = Oct n 
   | otherwise      = error "invalid value: " ++ show n
然后定义一个函数
oct
,使
oct
成为:

newtype Oct = Oct Int deriving(Show)
oct :: Int -> Oct
oct n 
   | n > 0 && n < 4 = Oct n 
   | otherwise      = error "invalid value: " ++ show n

希望这能有所帮助。

“数据类型”是描述数据构造函数的错误短语。@amalloy感谢您的反馈。我已经做了建议的改变。