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 :: Int
或 x :: 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
当我创建一个数字时:
x = 1
y = 2
z = 3
这些变量的类型是这样的:
ghci> :t x
ghci> Num a => a
这让我觉得 1 是一个 "data constructor",它构造的不是类型,也不是类型构造函数,而是受 Num
class 约束的任何类型。这使我可以通过 运行 x :: Int
或 x :: 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