haskell - 交错功能

标签 haskell recursion

我发现这段代码构建了一个与 Thue-Morse sequence 相对应的列表:

thueMorse :: [Int]
thueMorse = 0 : interleave (map (1-) thueMorse) (tail thueMorse)
    where interleave (x:xs) ys = x : interleave ys xs

它很完美并且能创造奇迹,但我无法理解它。一个例子:

> take 8 thueMorse 
[0,1,1,0,1,0,0,1]

如果我全局定义 interleave 函数并使用它,我会得到一个异常:

> let interleave (x:xs) ys = x : interleave ys xs
> interleave [1,2,3] [4,5,6]
[1,4,2,5,3,6*** Exception: <interactive>:29:5-47: Non-exhaustive patterns in function interleave

那么,上面的内容是如何工作的呢?是因为它是一个无限列表所以可以安全地永远交错吗?

最佳答案

是的,它有效,因为输入是一对无限列表。 interleave 的定义仅处理其第一个参数不为空的情况,即使用 : 构造函数。但是列表有第二个构造函数([]),该定义可能会忽略它。更完整的定义可能如下所示,具体取决于您希望它如何处理空输入:

interleave (x:xs) ys = x : interleave ys xs
interleave [] ys = ys

关于haskell - 交错功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25772235/

相关文章:

haskell - 访问 haskell 自定义数据类型中的值

performance - 优化一个产生过多垃圾的列表函数(不是堆栈溢出)

python - 在 Python 中使用递归

c - 函数返回前一个而不是递归 (c)

haskell - 我如何根据另一个准引用者写一个准引用者

multithreading - 为什么 `-threaded` 让它变慢?

haskell - 在 Haskell 中等待然后检测按键的简单方法是什么?

grails - 递归方法在grails/groovy单元测试用例中无法正常工作

recursion - 使用 Lisp 递归检查连续数字

javascript - jquery如何传递上次迭代的变量?