如何在Haskell中转换用户数据类型

如何在Haskell中转换用户数据类型,haskell,Haskell,我正在尝试定义自己的数据类型,并使用一个公共接口来处理它。但是我在创建类型后处理它时遇到了一些问题。这个例子可能会显示我正在尝试做什么以及我的意思 type Type1 = (Int, Int) data Type2 = Type2 [Type1] deriving (Show, Read) add_elem type1 type2 = Type2 (type1 : type2) 我得到一个错误,type2的预期类型是[Type1],但收到的却是type2。这很好——我不希

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

type Type1 = (Int, Int)

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

add_elem type1 type2 =
        Type2 (type1 : type2)
我得到一个错误,type2的预期类型是[Type1],但收到的却是type2。这很好——我不希望人们弄乱我的数据类型的内部结构,这就是强类型和封装的好处所在。但我希望能够在我的模块内实现这一点,以提供接口


我是不是完全走错了路?如果是,正确的方法是什么;否则,当我想将Type2转换为[Type1]时,如何将其转换为模式匹配!Haskell基本上有两个关于数据类型的基本操作

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

    -- For your case
    toT1s :: Type2 -> [Type1]
    toT1s (Type2 as) = as
    
    这里,
    type2as
    是一个模式匹配,它将
    Type2
    中的值绑定到
    as

  • 这类函数实际上非常常见,我们有一些叫做记录的糖

    data Type2 = Type2 {toT1s :: [Type1]}
    
    这是完全相同的,但节省了一些打字


    要了解更多信息,我推荐一个好的Haskell教程。我最喜欢的是模式匹配!Haskell基本上有两个关于数据类型的基本操作

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

    -- For your case
    toT1s :: Type2 -> [Type1]
    toT1s (Type2 as) = as
    
    这里,
    type2as
    是一个模式匹配,它将
    Type2
    中的值绑定到
    as

  • 这类函数实际上非常常见,我们有一些叫做记录的糖

    data Type2 = Type2 {toT1s :: [Type1]}
    
    这是完全相同的,但节省了一些打字


    要了解更多信息,我推荐一个好的Haskell教程。我最喜欢的是

    你遗漏了
    add_elem
    @GabrielGonzalez的类型签名,因为Haskell正确推断了类型你遗漏了
    add_elem
    @GabrielGonzalez的类型签名,类型签名是不必要的,因为Haskell正确地推断了类型我在Learn You A Haskell中遗漏了这一点。我知道我做错了什么,但不知道是什么。谢谢,这太完美了!(当然答案是模式匹配)我在《向你学习哈斯卡尔》中错过了这个。我知道我做错了什么,但不知道是什么。谢谢,这太完美了!(答案当然是模式匹配)