使用Haskell对列表进行分组

3

我试图按照每个元素第一个项的值对此列表中的元素进行分组,但无法使其工作。

我想要得到 [("A",[("EXP1",5),("EXP2", 9)]),("B",[("EXP15",8),("EXP24", 4)])] ,但是我遇到了错误:

import Data.Function (on)
import Data.List (sortBy, groupBy)
import Data.Ord (comparing)
    

myGroupElem :: (Eq a, Ord a) => [(a, b, c)] -> [(a, [(b,c)])]
myGroupElem = map (\l -> (fst . head $ l, map (b,c)  l)) . groupBy ((==) `on` fst)
          . sortBy (comparing fst)          

lData = [("A", "EXP1", 5),("A", "EXP2", 9),("B", "EXP15", 8),("C", "EXP16", 7),("B", "EXP24", 4)]

main = do
       print $ myGroupElem lData
1个回答

1

Here's the fixed code:

import Data.Function (on)
import Data.List (sortBy, groupBy)
import Data.Ord (comparing)

fst3 :: (a, b, c) -> a
fst3 (x, _, _) = x

next2 :: (a, b, c) -> (b, c)
next2 (_, b, c) = (b, c)

myGroupElem :: (Eq a, Ord a) => [(a, b, c)] -> [(a, [(b,c)])]
myGroupElem = map (\l -> (fst3 . head $ l, map next2 l)) . groupBy ((==) `on` fst3)
          . sortBy (comparing fst3)

lData = [("A", "EXP1", 5),("A", "EXP2", 9),("B", "EXP15", 8),("C", "EXP16", 7),("B", "EXP24", 4)]

main = do
       print $ myGroupElem lData

您的代码存在两个主要问题:第一个问题是您使用了fst,但这仅适用于2元组。因此,我创建了一个适用于3元组的fst3函数。另一个问题是map (b,c) l不是有效的lambda表达式。因此,我创建了一个next2函数,该函数获取3元组的最后两个元素,并进行映射。您也可以使用lambda表达式来解决这个问题:
map (\(_, b, c) -> (b, c)) l

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接