Haskell 选择列表中的元素

Pab*_*ero -1 haskell types list

我对这样的函数有问题:

数据城市=城市{汽车::字符串,重量::整数,颜色::字符串}

- 我有一个“城市”列表,我的函数必须制作一个元组列表,每个元组都是(汽车,“权重之和”),因此,如果汽车相等,则权重必须是添加,做这样的事情:

main> [(Porche,180),(Ferrari,400),(Opel,340)]
Run Code Online (Sandbox Code Playgroud)

汽车不能在输出列表中重复,因为必须添加它们的高度。

我正在考虑做一些事情,比如列出所有汽车类型,然后过滤权重并添加它们,制作一个列表,但我无法让它工作。

Sat*_*vik 5

我将指导您解决问题。与解决方案本身相比,了解如何得出解决方案更好。

import Data.List
data City = City {car :: String, weight :: Int, color :: String} deriving (Show)
Run Code Online (Sandbox Code Playgroud)

如果colorCity相等无关,您可以将 the 转换City为元组。你可以用它map来做到这一点。

city2tup :: [City] -> [(String,Int)]
city2tup = map (\(City c w _) -> (c,w))
Run Code Online (Sandbox Code Playgroud)

现在看看 functionsortgroupByfrom Data.List. 对第一个元素进行排序然后分组将把相似的汽车收集到一个列表中。所以你会有一个列表列表。现在你只需要折叠每个子列表并添加相应的权重。

collect :: [City] -> [(String,Int)]
collect = map (foldl1 collectWeight) . groupBy ((==) `on` fst) . sort . city2tup
Run Code Online (Sandbox Code Playgroud)

您仍然需要定义是什么collectWeight,但这应该很容易。