Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.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
在Haskell中编辑/更新图形_Haskell_Graph_Simulation - Fatal编程技术网

在Haskell中编辑/更新图形

在Haskell中编辑/更新图形,haskell,graph,simulation,Haskell,Graph,Simulation,我正在使用Data.Graph在Haskell中对模拟进行建模。模拟仅限于二维网格,我的图形将其建模。下面网格上每个点上的节点都将包含一个可能的分子类型,因此可能存在一个分子或什么都没有 1 - 2 - 3 | | | 4 - 5 - 6 | | | 7 - 8 - 9 我已经建立了这个表示,但是当涉及到更新分子的位置时,我觉得我在这个问题上走了很长的路。到目前为止,我所做的是将所有节点剥离到一个节点列表中。我已经编写了一个函数来交换这个

我正在使用Data.Graph在Haskell中对模拟进行建模。模拟仅限于二维网格,我的图形将其建模。下面网格上每个点上的节点都将包含一个可能的分子类型,因此可能存在一个分子或什么都没有

1  - 2  - 3  
|    |    |  
4  - 5  - 6  
|    |    |  
7  - 8 -  9  

我已经建立了这个表示,但是当涉及到更新分子的位置时,我觉得我在这个问题上走了很长的路。到目前为止,我所做的是将所有节点剥离到一个节点列表中。我已经编写了一个函数来交换这个节点列表中的两项。但是现在当我把所有的东西压缩到一起时,我遇到了问题,因为要生成一个新的图,我需要一个顶点列表,我可以很容易地从顶点图函数中获得。但是我还需要用边接触的顶点列表来压缩它。不幸的是,数据。Graph的Edge Graph函数返回一个Edge类型的元组列表,就我所见,这对生成一个图并没有直接帮助,尽管我可以编写一个函数来导出具有顶点边的列表顶点。这样做似乎足够让我想知道我是否忽略了这一点,是否存在一个Graph函数,它只获取一个Graph并返回一个带有更新节点的Graph?

您在这里使用Graph有什么特别的原因吗?在我看来,这组边几乎是固定的,你的网格只是在分子的位置上变化

为什么不直接使用数组或其他数据结构来关注分子及其位置呢?例如:

import Data.Array

data Molecule = H2O | CO2 | NH3

type Grid = Array (Int, Int) (Maybe Molecule)

-- creates an empty grid                                                        
grid :: Int -> Int -> Grid
grid m n = array ((0, 0), (m - 1, n - 1)) assocs
  where
    assocs = [((i, j), Nothing) | i <- [0 .. m - 1], j <- [0 .. n - 1]]

-- swap the molecules at the specified indices                                  
swap :: (Int, Int) -> (Int, Int) -> Grid -> Grid
swap (i, j) (u, v) grid =
  grid // [((i, j), grid ! (u, v)), ((u, v), grid ! (i, j))]

-- etc.
导入数据。数组
数据分子=H2O | CO2 | NH3
类型网格=数组(Int,Int)(可能是分子)
--创建一个空网格
网格::Int->Int->grid
网格mn=数组((0,0),(m-1,n-1))关联
哪里
assocs=[((i,j),无)| i网格->网格
互换(i,j)(u,v)网格=
格网/[((i,j),格网!(u,v)),((u,v),格网!(i,j))]
--等等。
(如果你有充分的理由使用图表,我当然完全不符合这里的规定,在这种情况下,我很抱歉……

FGL有这么好的“背景”用于在图形查询中进行模式匹配的机制。您可以将其想象为拖动选定的顶点,使其位于图形其余部分的一侧。这可以让您查看该顶点如何连接到图形其余部分

{-# LANGUAGE TupleSections #-}
import Control.Applicative
import Control.Arrow
import Data.Graph.Inductive

-- Example graph from SO question.
graph :: Gr (Maybe Int) ()
graph = mkGraph (map (id&&&Just) [1,2,3,4,5,6,7,8,9])
                (map (\(x,y) -> (x,y,())) $
                     concatMap gridNeighbors [1..9])
  where gridNeighbors n = map (n,) 
                        . filter ((&&) <$> valid <*> not . boundary n) 
                        $ [n-3,n-1,n+1,n+3]
        valid x = x > 0 && x < 10
        boundary n x = case n `rem` 3 of
                         0 -> x == n + 1
                         1 -> x == n - 1
                         _ -> False

-- Swap the labels of nodes 4 and 7
swapTest g = case match 4 g of
               (Just c4, g') -> case match 7 g' of
                                  (Just c7, g'') -> setLabel c4 (lab' c7) & 
                                                    (setLabel c7 (lab' c4) &
                                                     g'')
                                  _ -> error "No node 7!"
               _ -> error "No node 4!"
  where setLabel :: Context a b -> a -> Context a b
        setLabel (inEdges, n, _, outEdges) l = (inEdges, n, l, outEdges)
{-#语言元组}
导入控制
导入控制。箭头
导入Data.Graph.inclusive
--来自SO问题的示例图。
图形::Gr(可能是Int)()
graph=mkGraph(map(id&&Just)[1,2,3,4,5,6,7,8,9])
(地图(\(x,y)->(x,y,())$
concatMap网格邻居[1..9])
其中gridneights n=map(n,)
.filter((&&)无效。边界n)
$[n-3,n-1,n+1,n+3]
有效x=x>0&&x<10
边界nx=第n`rem`3种情况
0->x==n+1
1->x==n-1
_->错误
--交换节点4和节点7的标签
swapTest g=案例匹配4 g
(仅c4,g')->案例匹配7 g'
(仅c7,g’)->设置标签c4(实验室c7)和
(设置标签c7(实验室c4)&
g')
_->错误“没有节点7!”
_->错误“没有节点4!”
其中setLabel::Context a b->a->Context a b
setLabel(inEdges,n,u2;,outEdges)l=(inEdges,n,l,outEdges)

您可以尝试运行
swapTest graph
查看图表中节点4和节点7的标签是否已交换。

如果我使用图形,我可以查看相邻节点是否被其他分子占用以进行碰撞检测。@mikeyP但您也可以使用数组来执行此操作,不是吗?没错,图形下面是一个数组。但是使用gr时aph我将能够移除图上的节点,即分子无法通过的区域。我看不到一种巧妙的方法来使用数组。