2012-03-02 2 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

+0

@Nate D'oh, спасибо! – drozzy

ответ

2

Определение аксессора для вашего типа Container:

content (Container x) = x 

Тогда вы можете сделать это:

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

Нет, извините, это должно быть [6,6,6] - это похоже на сумму по столбцам ... – drozzy

+0

@drozzy: Я обновил свой ответ. –

+0

Прохладный, я только что построил свой тип данных с синтаксисом записи, и это позаботилось об этом! – drozzy

1

Проще всего сделать было бы отобразить список перед суммированием:

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

Если вы хотите получить другую сумму, вы можете просто заменить функцию sum с чем-то другим.

2

Это похоже на ответ, который вы получили на ваш другой вопрос, за исключением вы должны принять ваши внутренние списки из своих Container с:

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] 

Учитывая, что у вас есть один и тот же ответ, как Grzegorz дает, но с неявно определенной getContents функции в месте его явно определенной content функции:

sum' = map sum . transpose . map getContents 
Смежные вопросы