Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List Haskell中边列表的邻接矩阵_List_Haskell_Graph_Multidimensional Array_Adjacency Matrix - Fatal编程技术网

List 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

我有一个锦标赛的1d球队列表和一个2d“对手矩阵”

我只想为每支球队提取一份对手名单

我只是在学习Haskell,我想知道,是否有人能为下面已经运行的代码想出一个更优雅的解决方案。。。也许是一份清单

代码:

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堆栈。。。好主意!谢谢。。。你能把标题改成有意义的吗?我看你对那种问题很熟悉。谢谢。。。你能把标题改成有意义的吗?我看你对那种问题很熟悉。