Haskell键入为诠释和双的

问题描述:

只是关于打字的快速问题。Haskell键入为诠释和双的

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

中的文件,因为我已经定义了一个类型:

type list = [(String, Int)] 

我怎样才能改变类型与支持Int S和Double小号我定义的类型与我在ghci中写的类似?

首先,您的代码有错误。数据类型必须以大写字母开始:

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程序员通常遵循规则“不要在数据声明中包含类型约束”。

+0

谢谢,就是我在找的东西。我会在几分钟内接受答案。 – user1453477

+2

请注意,'DataTypeContexts'在Haskell2010中消失了。你仍然可以使用GHC扩展名,但是为什么会这样呢,他们从来没有用过。 –

+0

最后一件事,我有一个函数,检查列表中是否有两个数字相等,使用contrament Num a =>给我一个错误,它不能通过使用'=='来推断(Eq a)。 为了解决这个问题,我将约束条件改为了等式a => ...这是最好的方法,因为我需要将Eq a =>约束添加到我的很多函数中。 – user1453477