当我创建一个如下数字时:
x = 1
y = 2
z = 3
这些变量的类型如下:
ghci> :t x
ghci> Num a => a
这让我觉得1是一个"数据构造函数"它构造的不是类型,也不是类型构造函数,而是由Num
类约束的任何类型。这允许我通过运行Num a
或x :: Int
进一步向编译器澄清我想要的x :: Integer
。
我尝试了解如何在文档中完成此操作,但没有运气。
所以问题是,如何才能创建类似的数据类型?换句话说,我如何创建一组类似于1,2,3,4,5...
的数据构造函数来创建类型MyOwnClass a => a
的值,其中MyOwnClass
是我自己创建的任意类?
例如:
x = A
y = д
z = Ψ
ghci> :t x
ghci> Alphabet a => a
答案 0 :(得分:5)
数字很特别。类Num
有一个fromInteger
方法,用于实现数字的解释。因此,当您看到1729
时,它是fromInteger 1729
的缩写,其中第二个1729
是文字Integer
。除了数字(和字符串,给定OverloadedStrings
扩展名)之外,你不能自己创造这种神奇的解释。
那就是说,如果你感兴趣的字母是有限的,你可以使用通常的类型类机制来做到这一点,只要你遵循语言的句法规则(例如变量必须以小写字母开头):
class Alphabet t where
a :: t
b :: t
...
现在
ghci> :t a
a :: (Alphabet t) => t
答案 1 :(得分:1)
class Alphabet t where
a :: t
instance Alphabet Int where
a = 1
x = a
ghci> :t x
ghci> Alphabet t => t
这就是类型类的工作方式:)