-1

次のような関数に問題があります。

data City = City {Car :: String, Weight :: Int, Color :: String}

-「City」のリストがあり、関数はタプルのリストを作成する必要があり、各タプルは (Car、「重みの合計」) であるため、Car が等しい場合、重みは追加して、次のようにします。

main> [(Porche,180),(Ferrari,400),(Opel,340)]

車の重量を追加する必要があるため、出力リストで車を繰り返すことはできません。

全車種のリストを作って、重みをフィルタリングして足し合わせてリストを作ろうと思ったのですが、うまくいきません。

4

2 に答える 2

5

解決策をご案内します。ソリューション自体よりも、ソリューションに到達する方法を理解する方が適切です。

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

color等しいこととは何の関係もない場合は、をタプルにCity変換できます。Cityあなたはそれをするために使うことができますmap

city2tup :: [City] -> [(String,Int)]
city2tup = map (\(City c w _) -> (c,w))

次に、関数sortgroupByからを見てくださいData.List。最初の要素で並べ替えてからグループ化すると、類似した車がリストにまとめられます。したがって、リストのリストがあります。ここで、各サブリストを折りたたんで、対応する重みを追加する必要があります。

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

あなたはまだ何collectWeightであるかを定義する必要がありますが、それは簡単なはずです。

于 2012-12-29T06:07:48.960 に答える