如何在Haskell中的用户数据类型之间进行转换

时间:2013-11-19 05:08:45

标签: haskell

我正在尝试定义自己的数据类型,并有一个公共接口来处理它。但是在创建后使用类型时我遇到了一些麻烦。这个例子可能会显示我正在尝试做什么以及我的意思。

type Type1 = (Int, Int)

data Type2 = Type2 [Type1] deriving (Show, Read)

add_elem type1 type2 =
        Type2 (type1 : type2)

我得到的错误是type2的预期类型是[Type1]但是收到了Type2。这很棒 - 我不希望人们弄乱我的数据类型的内部,这就是强类型和封装的好处。但我希望能够在我的模块中执行此操作以提供界面。

我是否完全以错误的方式处理事情?如果是这样,这样做的正确方法是什么;否则如何在我想要的时候将我的Type2转换为[Type1]?

1 个答案:

答案 0 :(得分:4)

模式匹配!基本上Haskell对数据类型有两个基本操作,

  1. 构造函数:您已经知道这些,它们基本上就像Type2 :: [Type1] -> Type2这样的函数。您可以使用它们来构建各种类型。
  2. 模式匹配:这样你可以拆开数据结构并查看其内部字段

    -- For your case
    toT1s :: Type2 -> [Type1]
    toT1s (Type2 as) = as
    

    此处Type2 as是一种模式匹配,用于将Type2内框的值绑定到as

  3. 这些功能实际上是如此常见,我们有一些叫做记录

    的糖
    data Type2 = Type2 {toT1s :: [Type1]}
    

    这完全相同,但可以节省一些打字。

    要了解更多相关信息,我建议您使用一个好的Haskell教程。我最喜欢的是Learn You A Haskell