私はHaskellの初心者です。convertKVList
一部のキーが繰り返される可能性のあるキーと値のペアのフラットリストを取得し、それをキーからすべてのキーが一意である値のリストへのマッピングに変換する関数を作成するとします。たとえば、のペアのリストで、Int
次の動作が必要です。
> convertKVList [(1, 2), (1, 4), (1, 3), (2, 3)]
[(1,[3,4,2]),(2,[3])]
これは、私がやりたいことを実行するために利用できるライブラリ関数があるはずの十分に一般的なタスクのようですが、私が見たときに何も見つかりませんでした。最後に、誰かが私がで作曲することを提案しMap.toList
ましたMap.fromListWith (++)
、そして私はこれで終わりました:
import Data.Map as Map (toList, fromListWith)
convertKVList :: (Ord a) => [(a, b)] -> [(a, [b])]
convertKVList ls =
(Map.toList . Map.fromListWith (++) . map (\(x,y) -> (x,[y]))) ls
私の質問は、より経験豊富なHaskellersに関するもので、2つの部分に分かれています。1つは、これをどのように行うか、または「より良い」(読みやすい、より効率的な、またはその両方)方法があるかどうかです。
第二に、どうすれば自分でこれを思い付くことができたでしょうか?タイプを作りたいと思っていたのですが[(a, b)] -> [(a, [b])]
、それをHoogleに入れても、何の役にも立ちませんでした。そして、私はData.Map
ドキュメントを見ましたが、特に役立つものとして飛び出したことfromListWith
もありませんでした。toList
だから:あなたはこの問題についてどのように考えますか?(私は、これらの質問の両方が主観的であり、特に2番目の質問であることを認識しています。)
ありがとう!