我有自己的数据类型:
type Types = String
data MyType = MyType [Types]
我有一个实用函数:
initMyType :: [Types] -> MyType
initMyType types = Mytype types
现在我创建:
let a = MyType ["1A", "1B", "1C"]
我该如何从a
中获取列表["1A", "1B", "1C"]
?一般来说,我该如何从数据构造器中获取数据呢?
getList (MyType lst) = lst
data MyType = MyType { getList :: [Types] }
这定义了一个类型,与之完全相同
data MyType = MyType [Types]
getList :: MyType -> [Types]
这允许(但不需要)使用语法MyType { getList = ["a", "b", "c"] }
构建MyType的值。顺便说一下,除非initMyTypes
还有其他功能,否则它并不是必需的,因为它与构造函数MyType完全相同(但不能在模式匹配中使用)。
在Haskell中,有许多模式匹配的方法。详见http://www.haskell.org/tutorial/patterns.html,了解模式可以用于哪些地方(如case语句),以及不同种类的模式(惰性模式、'as'模式等)。
(面向未来的答案。)
因此,您的任务是从数据类型构造函数中获取所有字段。
这里有一种相当优雅的方法来实现这一点。
我们将使用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