【问题标题】:Group elements of a list using Haskell使用 Haskell 对列表的元素进行分组
【发布时间】:2020-11-09 21:08:50
【问题描述】:

我正在尝试根据每个元素的第一项的值对该列表的元素进行分组,但无法使其工作。

我正在尝试获取 [("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

【问题讨论】:

    标签: haskell


    【解决方案1】:

    这里是固定代码:

    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 元组上定义。所以,我制作了一个适用于三元组的fst3。另一个是map (b,c) l,它不是有效的 lambda。因此,我创建了一个 next2 函数,它获取 3 元组的最后两个元素,并与之映射。你也可以只使用 lambda:

    map (\(_, b, c) -> (b, c)) l
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多