Haskell数据类型字段

3

我有自己的数据类型:

type Types = String
data MyType = MyType [Types]

我有一个实用函数:

initMyType :: [Types] -> MyType
initMyType types = Mytype types

现在我创建:
let a = MyType ["1A", "1B", "1C"]

我该如何从a中获取列表["1A", "1B", "1C"]?一般来说,我该如何从数据构造器中获取数据呢?

4个回答

8
你可以在代码中某个位置使用模式匹配,或者编写解构函数:
getList (MyType lst) = lst

8
除了像arrowdodger的答案中使用模式匹配之外,您还可以使用记录语法来自动定义访问器:
data MyType = MyType { getList :: [Types] }

这定义了一个类型,与之完全相同

data MyType = MyType [Types]

但同时还定义了一个函数。
getList :: MyType -> [Types]

这允许(但不需要)使用语法MyType { getList = ["a", "b", "c"] }构建MyType的值。顺便说一下,除非initMyTypes还有其他功能,否则它并不是必需的,因为它与构造函数MyType完全相同(但不能在模式匹配中使用)。


2

在Haskell中,有许多模式匹配的方法。详见http://www.haskell.org/tutorial/patterns.html,了解模式可以用于哪些地方(如case语句),以及不同种类的模式(惰性模式、'as'模式等)。


1

(面向未来的答案。)

因此,您的任务是从数据类型构造函数中获取所有字段。
这里有一种相当优雅的方法来实现这一点。

我们将使用DeriveFoldable GHC扩展,因此要启用它,我们必须 更改您的数据类型声明,如下所示:data MyType a = MyType [a] deriving (Show, Foldable)

这是一种通用的方法,可以获取数据构造函数中的所有数据。
这就是整个解决方案:

{-# LANGUAGE DeriveFoldable #-}

import Data.Foldable (toList)

type Types = String
data MyType a = MyType [a] deriving (Show, Foldable)

main = 
  let a      = MyType ["1A", "1B", "1C"] :: MyType Types
      result = toList a
  in print result

打印结果将会给你想要的 '["1A","1B","1C"]'。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接