我真的很困惑你应该如何从haskell的类型类中获取数据。我正在寻找C背景,所以发现你不能只访问数据真的很困难。我所拥有的是这样的:
data MyType = MyType String deriving (Show)
display :: [MyType] -> IO ()
display ((MyType name):xs) = do
display xs
putStr name
基本上我在这里想要访问'name',但它似乎不起作用。我可以通过在代码中引用对象来访问类型类实例中的数据,还是必须将其内容映射到变量?如果是这样的话?
关于这方面的好教程的链接将不胜感激,我已经读过'了解你是一个非常好的Haskell',但是当我试图偏离给出的例子时,似乎总是有很多我需要知道才能得到它完成。 -A
答案 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
以及其他一些事情。