List Data.Graph中的路径函数在Haskell中是如何工作的?

List Data.Graph中的路径函数在Haskell中是如何工作的?,list,haskell,recursion,graph,functional-programming,List,Haskell,Recursion,Graph,Functional Programming,我已经阅读了路径函数中的文档(对于有向图)。搜索引擎里没有太多东西 我所发现的一切基本上归结为 它真正说明的是路径函数的作用(我已经知道),以及输出的示例。我想弄清楚的是,路径函数是如何工作的,或者它是如何手动实现的。到目前为止,我已经走到了这一步,但现在我陷入了困境(或者可能完全走错了路,我不能确定): 但是我很难看到如何正确地得到递归。我想我只是盯着它看了太久,看不清整个问题了。逻辑应该是这样的: 它从x=n的元组中获取y值 它查找上面Y值列表中x所在的所有元组 如果没有Y值=m,则在n=

我已经阅读了路径函数中的文档(对于有向图)。搜索引擎里没有太多东西

我所发现的一切基本上归结为

它真正说明的是路径函数的作用(我已经知道),以及输出的示例。我想弄清楚的是,路径函数是如何工作的,或者它是如何手动实现的。到目前为止,我已经走到了这一步,但现在我陷入了困境(或者可能完全走错了路,我不能确定):

但是我很难看到如何正确地得到递归。我想我只是盯着它看了太久,看不清整个问题了。逻辑应该是这样的:

  • 它从x=n的元组中获取y值
  • 它查找上面Y值列表中x所在的所有元组
  • 如果没有Y值=m,则在n=(每个X值)和m=m的新元组列表上执行路径函数
  • 如果在Y值中找到m,则返回true
有人能给我指出正确的方向吗?最好不用为我输入代码


谢谢

感谢评论员提供的资源,帮助我编写了以下解决方案:

member _ [] = False
member n (x:xs)
    | x == n = True
    | otherwise = member n xs
    
unique [] = []
unique (x:xs)
    | member x xs == True = unique xs
    | otherwise = x:(unique xs)


findAllEndsForX :: [(Int , Int)] -> Int -> [Int]
findAllEndsForX [] _ = []
findAllEndsForX ((a,b):xs) y
  | xs == [] = a:[b]
  | a == y = a:(findAllEndsForX xs b)
  | otherwise = (findAllEndsForX xs b)

accessible :: [(Int , Int)] -> Int -> [Int]
accessible [] _ = []
accessible xs n = unique (findAllEndsForX xs n)

path' :: [(Int , Int)] -> Int -> Int -> Bool
path' [] _ _ = False
path' xs v w = member w (accessible xs v)

我的最终目标是模仿路径特性的功能,而不一定是实现。我想在不使用任何预定义函数的情况下完成这项工作。

您熟悉这个概念吗?因为这就是
path
所做的(特别是深度优先搜索)。你看了吗?@李耀霞我确实理解这个概念,这是我没有正确实现的yet@Bergi酷,我在找类似的东西,但我想我错过了it@Bulbasaur如果您单击文档中的“源”链接,则可以使用它
member _ [] = False
member n (x:xs)
    | x == n = True
    | otherwise = member n xs
    
unique [] = []
unique (x:xs)
    | member x xs == True = unique xs
    | otherwise = x:(unique xs)


findAllEndsForX :: [(Int , Int)] -> Int -> [Int]
findAllEndsForX [] _ = []
findAllEndsForX ((a,b):xs) y
  | xs == [] = a:[b]
  | a == y = a:(findAllEndsForX xs b)
  | otherwise = (findAllEndsForX xs b)

accessible :: [(Int , Int)] -> Int -> [Int]
accessible [] _ = []
accessible xs n = unique (findAllEndsForX xs n)

path' :: [(Int , Int)] -> Int -> Int -> Bool
path' [] _ _ = False
path' xs v w = member w (accessible xs v)