2011-11-08 96 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」]' 你想要的。