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

时间:2015-04-02 08:55:59

标签: haskell types typeclass

当我创建一个如下数字时:

x = 1
y = 2
z = 3

这些变量的类型如下:

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

这让我觉得1是一个"数据构造函数"它构造的不是类型,也不是类型构造函数,而是由Num类约束的任何类型。这允许我通过运行Num ax :: Int进一步向编译器澄清我想要的x :: Integer

我尝试了解如何在文档中完成此操作,但没有运气。

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

例如:

x = A
y = д
z = Ψ

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

2 个答案:

答案 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

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