小编Eri*_*rik的帖子

Haskell:处理死锁的自引用列表

GHC是否允许以下​​内容永久阻止是否有任何有用的理由:

list = 1 : tail list
Run Code Online (Sandbox Code Playgroud)

在列表迭代器/生成器中看起来有点复杂,我们应该能够做一些更有用的事情:

  1. 返回 error "Infinitely blocking list"
  2. 返回 [1,1]

解释2:似乎有可能在进入生成器获取元素时N,我们可以将生成器内的所有自引用限制为列表但结束于N-1(我们注意到read N范围内部generate N并返回列表结尾).这是一种使用范围的简单死锁检测.

显然,这对于上面的玩具示例没有用处,但它可以允许更有用/优雅的有限,自引用列表定义,例如:

primes = filter (\x -> none ((==0).mod x) primes) [2..]
Run Code Online (Sandbox Code Playgroud)

请注意,任何更改都应该只影响当前导致无限块的列表生成器,因此它们似乎是向后兼容的语言更改.

忽略了稍微做出这种改变所需的GHC复杂性,这种行为会破坏我所遗漏的任何现有语言行为吗?关于这种变化的"优雅"的任何其他想法?

另请参阅另一个可以从下面获益的BFS示例.对我来说,这似乎比其他一些解决方案更实用/更优雅,因为我只需要定义bfsList 什么,而不是如何生成它(即指定终止条件):

bfs :: (a -> Bool) -> (a -> [a]) -> [a] -> Maybe a
bfs predf expandf xs = find predf bfsList
    where bfsList = xs ++ concatMap expandf bfsList
Run Code Online (Sandbox Code Playgroud)

recursion haskell deadlock list self-reference

3
推荐指数
1
解决办法
97
查看次数

标签 统计

deadlock ×1

haskell ×1

list ×1

recursion ×1

self-reference ×1