Sha*_*abu 1 mapping recursion haskell list
我有这个神秘的功能,我无法理解:
mystery :: [a] -> [[a]]
mystery [] = [[]]
mystery (x:xs) = sets ++ (map (x:) sets)
where sets = mystery xs
Run Code Online (Sandbox Code Playgroud)
以下是一些结果输入:
mystery [1,2] returns [[],[2],[1],[1,2]]
mystery [1,2,3] returns [[],[3],[2],[2,3],[1],[1,3],[1,2],[1,2,3]]
Run Code Online (Sandbox Code Playgroud)
通过查看结果,我可以看到它计算列表中所有可能的数字组合,但不是所有可能的permeations ......我想.
我遇到的麻烦实际上是通过递归并理解函数如何获得这些结果.
我想我得到了它的开始 - >将(1 :)映射到[2],产生[1,2],但是在这一点上我很困惑递归是如何工作的,以及我是否还在映射(1 :)或现在(2 :),到底是什么.
如果有人可以通过逐步解释(使用提供的示例之一)这个函数如何工作(使用地图和设置递归)来帮助我,我将不胜感激!
谢谢!
Haskell将执行所谓的惰性求值,这意味着它只会从左到右(通常)需要它们.以你的例子为例mystery [1, 2],Haskell将执行以下操作:
sets ++ (map (x:) sets)
Run Code Online (Sandbox Code Playgroud)
评估结果为:
mystery (2:[]) ++ (map (1:) sets)
Run Code Online (Sandbox Code Playgroud)
在这一点上,我们正在打电话 mystery (2:[])
mystery ([]) ++ (map (2:) sets) ++ (map (1:) sets)
Run Code Online (Sandbox Code Playgroud)
mystery ([]) 将返回一个空的列表列表
[[]] ++ (map (2:) sets) ++ (map (1:) sets)
[[]] ++ (map (2:) mystery []) ++ (map (1:) sets)
Run Code Online (Sandbox Code Playgroud)
所以现在Haskell将尝试(2:)在包含空列表的列表中应用该函数
[[]] ++ (2:[[]]) ++ (map (1:) sets)
[[]] ++ [[2]] ++ (map (1:) sets)
[[], [2]] ++ (map (1:) sets)
Run Code Online (Sandbox Code Playgroud)
这是事情变得更加混乱的地方.
[[], [2]] ++ (map (1:) mystery (2:[]))
Run Code Online (Sandbox Code Playgroud)
最后一次sets评估mystery (2:[])
[[], [2]] ++ (map (1:) (sets ++ (map (2:) sets)))
[[], [2]] ++ (map (1:) (mystery [] ++ (map (2:) sets))
[[], [2]] ++ (map (1:) ([[]] ++ (map (2:) mystery []))
[[], [2]] ++ (map (1:) ([[]] ++ (2:[[]]))
[[], [2]] ++ (map (1:) ([[]] ++ [[2]])
Run Code Online (Sandbox Code Playgroud)
现在(1:)将应用于包含空列表的列表,以及包含2的列表:
[[], [2]] ++ (map (1:) ++ [[], [2]])
[[], [2]] ++ [[1], [1, 2]]
[[], [2], [1], [1, 2]]
Run Code Online (Sandbox Code Playgroud)
手术的真正含义在于最后两节.Haskell创建一个类似的列表[[], [2]],然后将一个列表添加到每个列表的头部[[1], [1, 2]].
| 归档时间: |
|
| 查看次数: |
584 次 |
| 最近记录: |