我有一个数据类型,例如:
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,所以它应该有用吗?
答案 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