List Haskell中边列表的邻接矩阵
我有一个锦标赛的1d球队列表和一个2d“对手矩阵” 我只想为每支球队提取一份对手名单 我只是在学习Haskell,我想知道,是否有人能为下面已经运行的代码想出一个更优雅的解决方案。。。也许是一份清单 代码:List Haskell中边列表的邻接矩阵,list,haskell,graph,multidimensional-array,adjacency-matrix,List,Haskell,Graph,Multidimensional Array,Adjacency Matrix,我有一个锦标赛的1d球队列表和一个2d“对手矩阵” 我只想为每支球队提取一份对手名单 我只是在学习Haskell,我想知道,是否有人能为下面已经运行的代码想出一个更优雅的解决方案。。。也许是一份清单 代码: findOp :: (Eq a, Num a) => [b] -> [a] -> [b] findOp (x:xs) (y:ys) | y == 1 = [x] ++ findOp xs ys | otherwise = findO
findOp :: (Eq a, Num a) => [b] -> [a] -> [b]
findOp (x:xs) (y:ys) | y == 1 = [x] ++ findOp xs ys
| otherwise = findOp xs ys
findOp [] [] = []
tab = [[0,1,0,1],
[1,0,1,0],
[0,1,0,1],
[1,0,1,0]]
teams = ["team a",
"team b",
"team c",
"team d" ]
main :: IO ()
main = do
let games = map (\x -> (fst x, findOp teams $ snd x)) $ zip teams tab
putStrLn $ show games
[("team a",["team b","team d"]),("team b",["team a","team c"]),("team c",["team b","team d"]),("team d",["team a","team c"])]
结果:
findOp :: (Eq a, Num a) => [b] -> [a] -> [b]
findOp (x:xs) (y:ys) | y == 1 = [x] ++ findOp xs ys
| otherwise = findOp xs ys
findOp [] [] = []
tab = [[0,1,0,1],
[1,0,1,0],
[0,1,0,1],
[1,0,1,0]]
teams = ["team a",
"team b",
"team c",
"team d" ]
main :: IO ()
main = do
let games = map (\x -> (fst x, findOp teams $ snd x)) $ zip teams tab
putStrLn $ show games
[("team a",["team b","team d"]),("team b",["team a","team c"]),("team c",["team b","team d"]),("team d",["team a","team c"])]
无论如何,假设这将很快被迁移,下面是一个答案:
tab = [[0,1,0,1],
[1,0,1,0],
[0,1,0,1],
[1,0,1,0]]
teams = ["team a",
"team b",
"team c",
"team d" ]
main = do
let matches = zip teams . map (map fst . filter ((== 1) . snd) . zip teams) $ tab
print matches
关键的细节是从地图(zip团队)选项卡开始。这将为您提供矩阵中的团队名称以及值。从这里开始,剩下的就是简单的数据操作——以及映射到每个内部列表的三个操作的手动融合
顺便说一下,这是一个将邻接矩阵转换为边列表的一般问题的具体例子。在软件中使用图形表示时,这是最简单和最基本的操作之一。无论如何,假设这将很快被迁移,下面是一个答案:
tab = [[0,1,0,1],
[1,0,1,0],
[0,1,0,1],
[1,0,1,0]]
teams = ["team a",
"team b",
"team c",
"team d" ]
main = do
let matches = zip teams . map (map fst . filter ((== 1) . snd) . zip teams) $ tab
print matches
关键的细节是从地图(zip团队)选项卡开始。这将为您提供矩阵中的团队名称以及值。从这里开始,剩下的就是简单的数据操作——以及映射到每个内部列表的三个操作的手动融合
顺便说一下,这是一个将邻接矩阵转换为边列表的一般问题的具体例子。在软件中使用图形表示时,这是最简单和最基本的操作之一。。。。也许有人会为这个问题找到一个更好的标题!你的“数组”是列表,你能举一个简单的例子说明你想在这里做什么吗?什么是绘图矩阵?这是如何与团队和对手联系在一起的?这是一个图表问题,很简单,使用列表并不完全愚蠢——例如,没有随机访问。不过,这可能更适合于代码复查堆栈交换。@Carl:到目前为止还不知道cr堆栈。。。好主意!。。。也许有人会为这个问题找到一个更好的标题!你的“数组”是列表,你能举一个简单的例子说明你想在这里做什么吗?什么是绘图矩阵?这是如何与团队和对手联系在一起的?这是一个图表问题,很简单,使用列表并不完全愚蠢——例如,没有随机访问。不过,这可能更适合于代码复查堆栈交换。@Carl:到目前为止还不知道cr堆栈。。。好主意!谢谢。。。你能把标题改成有意义的吗?我看你对那种问题很熟悉。谢谢。。。你能把标题改成有意义的吗?我看你对那种问题很熟悉。