在Haskell中构建数据类型列表

时间:2011-05-04 19:35:45

标签: list data-structures haskell syntax

我真的很困惑你应该如何从haskell的类型类中获取数据。我正在寻找C背景,所以发现你不能只访问数据真的很困难。我所拥有的是这样的:

data MyType = MyType String deriving (Show)


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

基本上我在这里想要访问'name',但它似乎不起作用。我可以通过在代码中引用对象来访问类型类实例中的数据,还是必须将其内容映射到变量?如果是这样的话?

关于这方面的好教程的链接将不胜感激,我已经读过'了解你是一个非常好的Haskell',但是当我试图偏离给出的例子时,似乎总是有很多我需要知道才能得到它完成。 -A

2 个答案:

答案 0 :(得分: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一起引入)。

答案 1 :(得分:1)

首先,我对你使用的单词感到有点困惑。 类型类是一种重载函数的方法。您拥有的是代数数据类型。你遇到的问题(如果我理解正确的话)是众所周知的。为了更轻松地访问数据,您可以使用记录语法

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

以及其他一些事情。