GHC是否允许以下内容永久阻止是否有任何有用的理由:
list = 1 : tail list
Run Code Online (Sandbox Code Playgroud)
在列表迭代器/生成器中看起来有点复杂,我们应该能够做一些更有用的事情:
error "Infinitely blocking list"[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)