Haskell抽象数据类型和检索字符/定义为字符串

时间:2011-11-07 22:14:09

标签: haskell

我有一个数据类型,例如:

data MyData = Something1 String

然后我有了一个功能

myFunction :: MyData -> String
myFunction x = x
在myFunction中

我想引用我的数据类型MyData中的字符,即['S','o','m','e'......'1']。但是,我收到以下错误:

  

无法匹配预期类型[Char]' with actual type MyData'       预期类型:字符串         实际类型:MyData

据我所知[Char]与String相同,我已将'Something1'声明为String,所以它应该有用吗?

2 个答案:

答案 0 :(得分:2)

[Char]String相同,但两者都不同于MyData。要访问存储在数据类型中的字符串,您需要使用模式匹配:

myFunction :: MyData -> String
myFunction (Something1 xs) = xs

这是因为data关键字构成了一种全新的数据类型。如果您只想要别名,还可以使用type关键字:

type MyData = String

myFunction :: MyData -> String
myFunction x = x

答案 1 :(得分:2)

MyData 与String相同。它非常相似。

您可以声明类似的同义词:

type MyData = String

然后MyData和String是同一类型的两个名称。实际上,String已经是[Char]的类型同义词。在这种情况下,myFunction只是身份函数id

或者您可以使用模式匹配从MyData中提取String,如下所示:

myFunction :: MyData -> String
myFunction (Something1 xs) = xs

或者,您可以使用记录语法自动创建访问者:

data MyData = Something1 { myFunction :: String}

(这与上面声明myFunction几乎完全相同,但您现在可以使用语法MyData以及Something1 { myFunction = x }

来构建Something1 x