2011-11-08 57 views
3

我有我自己的数据类型:Haskell的数据类型字段

type Types = String 
data MyType = MyType [Types] 

我有一个效用函数:

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

现在我创建:

let a = MyType ["1A", "1B", "1C"] 

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

回答

8

除了在arrowdodger的答案使用模式匹配,因为,你也可以使用记录语法自动定义的访问:

data MyType = MyType { getList :: [Types] } 

这定义了类型完全​​相同

data MyType = MyType [Types] 

还定义了一个函数

getList :: MyType -> [Types] 

,并允许(但不要求)的语法MyType { getList = ["a", "b", "c"] }用于构建的MyType的值。顺便说一句,initMyTypes并不是真的必要,除非它构造值之外还有别的东西,因为它和构造函数MyType完全一样(但不能用于模式匹配)。

8

您可以某处你的代码模式匹配,或者写解构功能:

getList (MyType lst) = lst 
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”]' 你想要的。