我正在尝试定义自己的数据类型,并有一个公共接口来处理它。但是在创建后使用类型时我遇到了一些麻烦。这个例子可能会显示我正在尝试做什么以及我的意思。
type Type1 = (Int, Int)
data Type2 = Type2 [Type1] deriving (Show, Read)
add_elem type1 type2 =
Type2 (type1 : type2)
我得到的错误是type2的预期类型是[Type1]但是收到了Type2。这很棒 - 我不希望人们弄乱我的数据类型的内部,这就是强类型和封装的好处。但我希望能够在我的模块中执行此操作以提供界面。
我是否完全以错误的方式处理事情?如果是这样,这样做的正确方法是什么;否则如何在我想要的时候将我的Type2转换为[Type1]?
答案 0 :(得分:4)
模式匹配!基本上Haskell对数据类型有两个基本操作,
Type2 :: [Type1] -> Type2
这样的函数。您可以使用它们来构建各种类型。模式匹配:这样你可以拆开数据结构并查看其内部字段
-- For your case
toT1s :: Type2 -> [Type1]
toT1s (Type2 as) = as
此处Type2 as
是一种模式匹配,用于将Type2
内框的值绑定到as
。
这些功能实际上是如此常见,我们有一些叫做记录
的糖data Type2 = Type2 {toT1s :: [Type1]}
这完全相同,但可以节省一些打字。
要了解更多相关信息,我建议您使用一个好的Haskell教程。我最喜欢的是Learn You A Haskell