2013-05-30 51 views
3

我想編寫一個Haskell函數,該函數使用11個字段的自定義類型並返回所有字段值的列表或者將字段名稱與其值。我不想明確地獲得每一個領域,因爲這將是冗長的,不太多才多藝。有沒有辦法做到這一點?Haskell函數返回任意數量的字段作爲列表

+1

所有字段值的列表?如果這些字段有不同的類型呢?特別是在Haskell中,嘗試這樣的事情根本就沒有意義。也許你應該考慮模式匹配,因爲這可能有助於減少冗長。如果它真的不夠靈活,你可能需要重新考慮你的設計。 –

+6

你能發表一些你認爲這會有用的示例代碼嗎?解決問題的方法可能比你在這裏提出的要好。 – hammar

回答

7

你寫的東西在某種程度上是可能的,但它不會很有用。

讓我們想象一下,我們堅持寫這個函數片刻。考慮到字段的值可能有不同的類型,你可能想要產生一個元組。即

data MyType = MyType Int String Bool 

getFields :: MyType -> (Int, String, Bool) 
getFields (MyType a b c) = (a,b,c) 

所以,你現在可以把它像

let v = MyType 1 "Hello" True 
let (x, y, z) = getFields v 

現在,這實際上不是非常有用的,因爲你可以在所有這些情況下,例如使用模式匹配

let v = MyType 1 "Hello" True 
let (MyType x y z) = v 

好吧,但是如果你想解決單個字段呢?像

let x = fst (getFields v) 

...如果沒有'getFields'函數怎麼做?嗯,你可以簡單地指定字段名(正如你可能已經做了):

data MyType = MyType 
      { i :: Int 
      , s :: String 
      , b :: Bool 
      } 

現在你可以訪問indivial場免費功能:

let x = i v 

...因爲分配名稱加時賽居然領域生成如i :: MyType -> Ints :: MyType -> String的功能。