Haskell: 构造一个 class 受约束的抽象数据类型,如数字

Haskell: Constructing an class constrained abstract data type like numbers

当我创建一个数字时:

x = 1
y = 2
z = 3

这些变量的类型是这样的:

ghci> :t x
ghci> Num a => a

这让我觉得 1 是一个 "data constructor",它构造的不是类型,也不是类型构造函数,而是受 Num class 约束的任何类型。这使我可以通过 运行 x :: Intx :: Integer.

进一步向编译器阐明我想要哪个 Num a

我试图在文档中找出这是如何完成的,但没有成功。

所以问题是,如何创建类似的数据类型?换句话说,我如何创建一组类似于 1,2,3,4,5... 的数据构造函数,它创建一个 MyOwnClass a => a 类型的值,其中 MyOwnClass 是我自己创建的任意 class ?

例如:

x = A
y = д
z = Ψ

ghci> :t x
ghci> Alphabet a => a
class Alphabet t where
    a :: t

instance Alphabet Int where
    a = 1

x = a

ghci> :t x
ghci> Alphabet t => t

这就是类型类的工作方式:)

数字很特殊。 class Num 有一个 fromInteger 方法来实现数字的解释。因此,当您看到 1729 时,它是 fromInteger 1729 的缩写,其中第二个 1729 是文字 Integer。除了数字(和字符串,给定 OverloadedStrings 扩展名),您无法自己为其他事物创建如此神奇的解释。

就是说,如果您感兴趣的字母表是有限的,您可以使用通常的类型class 机制来做到这一点,只要您遵循语言的句法规则(例如,变量必须以小写字母):

class Alphabet t where
    a :: t
    b :: t
    ...

现在

ghci> :t a
a :: (Alphabet t) => t