Haskell为Int's和Double's打字

时间:2012-06-13 11:20:45

标签: haskell typing

关于打字的简单问题。

如果我输入ghci :t [("a",3)],我会回来[("a",3)] :: Num t => [([Char], t)]

在文件中我将类型定义为:

type list = [(String, Int)]

如何更改类型以支持我定义的IntDouble类型,类似于我在ghci中写的内容?

1 个答案:

答案 0 :(得分:4)

首先,您的代码中存在错误。数据类型必须以大写字母开头:

type List = [(String, Int)]

(请注意String[Char]的类型同义词,即它们的类型完全相同)。我们将以迂回的方式解决您的问题。请注意,您可以在元组的第二个插槽中使类型完全一般:

type List a = [(String,a)]

以便您的类型参数化任意类型。如果您需要专门处理某些函数中的数字类型,那么您可以单独为每个函数进行专门化。例如:

foo :: Num a => List a
foo = [("Hello",1),("World",2)]

我们可以在数据类型中包含一个约束,如下所示:

data Num a => List a = List [(String,a)]

但您仍然需要在每个函数声明中包含约束Num a => ...,因此您实际上不会保存任何键入内容。因此,Haskell程序员通常遵循“不在数据声明中包含类型约束”这一规则。