2011-05-04 36 views
5

我真的很困惑你应该如何从haskell中的类型类中获取数据。我来C的背景,所以发现你不能只访问数据真的很难。我有这样的事情:构建Haskell中的数据类型列表

data MyType = MyType String deriving (Show) 


display :: [MyType] -> IO() 
display ((MyType name):xs) = do 
     display xs 
     putStr name 

基本上这里我想访问“名称”,但它似乎并没有工作。我是否可以通过在代码中引用对象来访问类型类实例中的数据,还是必须将其内容映射到变量?如果是的话如何?

链接到这个很好的教程将不胜感激,我读过'学习你一个伟大的好Haskell',但当我试图偏离给出的例子总是似乎有很多我需要知道得到它完成了。 -A

回答

6

我想你可能会错过一些将它们结合在一起的小块。

首先,你有一个完全正常的数据类型,MyType,保存字符串:

data MyType = MyType String deriving (Show) 

现在,你要编写走这种类型的列表,打印每个元素,因为它去的功能。我们通过列表数据类型的递归来完成此操作。

因为名单有两种情况,一个空列表,[]和利弊的情况下,(:),我们有两个分支:

display :: [MyType] -> IO() 
display []     = return() 
display ((MyType name):xs) = do 
     putStrLn name 
     display xs 

现在,在这里我想你可能去坚持正在建设的一些数据这个类型。您已经知道如何通过模式匹配来区分它,并且使用几乎相同的语法构建数据。下面是MyType列表:

table = 
    [ MyType "john" 
    , MyType "don" 
    , MyType "eric" 
    , MyType "trevor" 
    ] 

最后,你可以从main

main = display table 

注意运行您的程序,这里没有类型类,只是代数数据类型(与data介绍)。

+0

有什么动态添加MyType s到列表的函数。设想一个处理某些东西的函数,我将一些字符串转换成MyType,然后将它们添加到MyTypes的全局列表中,我该怎么做? – 2017-02-22 14:16:14

1

首先,我对你使用的单词有点困惑。 A 类型类是一种重载函数的方法。你有什么是代数数据类型。你有问题(如果我理解正确的话)是众所周知的。对于访问数据更容易的目的,你可以使用记录语法

data Foo = Foo { 
    bar :: Int 
    , baz :: String 
} 

你看到的相似性在C结构?使用记录语法,一些有趣的事情是可能的:

bar y -- access member bar of y 
y { bar = z } -- Make a new record but with field bar changed to the value of z 

和其他一些东西。

+0

记录语法与C结构语法不同,因为每个字段都会生成一个用于从数据类型的实例中提取该字段的同名函数。在上面的例子中,你会得到'bar :: Foo - > Int'和'baz :: Foo - > String'。因此,不能在同一模块中使用名为'bar'或'baz'的字段创建另一条记录,因为不能为结果函数指定多个类型。 – pat 2011-05-04 20:05:41