2012-03-02 31 views
0

類似my previous question,但現在我有一個轉折!容器內列表的總和?

我的數據類型是這樣的:

data Container = Container [Double] 

,我想總結了這些嬰兒的列表,像這樣:

sum' [Container [1,1,1], Container [2,2,2], Container [3,3,3]] 
> [6,6,6] 

想不通這樣做的清潔方法。

+0

你的意思'[6,6,6]'? – Nate 2012-03-02 19:14:18

+0

@Nate D'oh,謝謝! – drozzy 2012-03-02 19:15:28

回答

2

定義一個訪問您的集裝箱類型:

content (Container x) = x 

然後,你可以這樣做:

sum' = map sum . transpose . map content 
+0

不,對不起,它應該是[6,6,6] - 它有點像列上的總和... – drozzy 2012-03-02 19:18:13

+0

@drozzy:我更新了我的答案。 – 2012-03-02 19:20:49

+0

很酷,我只是用記錄語法構造了我的數據類型,並且已經照顧到了! – drozzy 2012-03-02 19:33:03

1

做會總結之前到列表地圖最簡單的事情:

sum' = map (sum . (\ (Container ls) -> ls)) 

如果您想獲得不同的總和,您可以將sum函數用別的東西。

2

它類似於您收到您的其他問題的答案,但你必須拿出自己的Container S的你內心的名單:

import Data.List 
sum' = map sum . transpose . map (\ (Container cs) -> cs) 
0

嗯,我想我將其添加到答案你已經有了:一種傳統的做法是將記錄類型定義優先於所使用的簡單產品類型定義,因爲記錄類型爲您提供免費的存取器功能。所以,你會定義Container這樣的:

data Container = Container { getContents :: Double } 

Container定義爲一個字段的記錄類型,稱爲getContents。這對於比其他類型的字段一個有趣的名字,但問題是,現在getContents已被定義爲從提取該領域的功能Container

getContents (Container [1, 2, 3]) -- result: [1.0, 2.0, 3.0] 

鑑於這種情況,你有相同的答案格熱戈日給人,但在他的地方明確定義content功能的隱式定義getContents功能:

sum' = map sum . transpose . map getContents