Haskell 列表理解和“分组”
Haskell List comprehension and `group`
输入:
funcA [((0,'x'),1),((0,'y'),3),((1,'y'),3),((1,'z'),3),((2,'x'),2),((2,'y'),2)]
输出
[(0, 1, "x"), (0, 3, "y"), (1, 3, "yz"), (2, 2, "xy")]
我正在尝试按起始节点和目标节点分组,然后 concat
所有边名称(值如 'x'
、'y'
...)。所以输出顺序是[(start, end, "concat val"), ...]
如何用 Haskell 语言编写 funcA
?
我尝试了 groupBy
、列表理解、map
函数,但无法弄明白。
您可以将 funcA
定义为:
import Data.Function (on)
import Data.List (groupBy)
funcA :: Eq a => [((a,b),a)] -> [(a,a,[b])]
funcA =
map (\s@(((x,y),_):_) -> (x, y, map snd s))
. groupBy ((==) `on` fst)
. map (\((x,v),y) -> ((x,y),v))
给定列表:[((0,'x'),1),((0,'y'),3),((1,'y'),3),((1,'z'),3),((2,'x'),2),((2,'y'),2)]
链尾的map
将坐标连接成元组:
[((0,1),'x'),((0,3),'y'),((1,3),'y'),((1,3),'z'),((2,2),'x'),((2,2),'y')]
groupBy
组坐标:
[[((0,1),'x')],[((0,3),'y')],[((1,3),'y'),((1,3),'z')],[((2,2),'x'),((2,2),'y')]]
第一个map
将具有相同坐标的字符组合成具有该坐标的字符串。
输入:
funcA [((0,'x'),1),((0,'y'),3),((1,'y'),3),((1,'z'),3),((2,'x'),2),((2,'y'),2)]
输出
[(0, 1, "x"), (0, 3, "y"), (1, 3, "yz"), (2, 2, "xy")]
我正在尝试按起始节点和目标节点分组,然后 concat
所有边名称(值如 'x'
、'y'
...)。所以输出顺序是[(start, end, "concat val"), ...]
如何用 Haskell 语言编写 funcA
?
我尝试了 groupBy
、列表理解、map
函数,但无法弄明白。
您可以将 funcA
定义为:
import Data.Function (on)
import Data.List (groupBy)
funcA :: Eq a => [((a,b),a)] -> [(a,a,[b])]
funcA =
map (\s@(((x,y),_):_) -> (x, y, map snd s))
. groupBy ((==) `on` fst)
. map (\((x,v),y) -> ((x,y),v))
给定列表:[((0,'x'),1),((0,'y'),3),((1,'y'),3),((1,'z'),3),((2,'x'),2),((2,'y'),2)]
链尾的
map
将坐标连接成元组:[((0,1),'x'),((0,3),'y'),((1,3),'y'),((1,3),'z'),((2,2),'x'),((2,2),'y')]
groupBy
组坐标:[[((0,1),'x')],[((0,3),'y')],[((1,3),'y'),((1,3),'z')],[((2,2),'x'),((2,2),'y')]]
第一个
map
将具有相同坐标的字符组合成具有该坐标的字符串。