sml foldl解释/跟踪
我试图弄明白这一点已经有一段时间了,但我没有成功。 以[1,2,3]的输入参数为例,下面的函数(powerset)是如何进行的? 非常感谢你的帮助sml foldl解释/跟踪,sml,fold,Sml,Fold,我试图弄明白这一点已经有一段时间了,但我没有成功。 以[1,2,3]的输入参数为例,下面的函数(powerset)是如何进行的? 非常感谢你的帮助 funpsl=foldl(fn(x,tl)=>tl@map(fnxs=>x::xs)tl)[[]]L 要正确使用该函数,必须假设输入列表中没有重复项 该功能可理解如下: 我们从一个累加器开始,累加器是一组只包含一个空集的集合([[]]) 在每个步骤中,我们获取累加器中的每个集合,将当前元素x添加到它们中,并将这些结果添加到累加器中 最终结果是一组所
funpsl=foldl(fn(x,tl)=>tl@map(fnxs=>x::xs)tl)[[]]L 要正确使用该函数,必须假设输入列表中没有重复项 该功能可理解如下:
- 我们从一个累加器开始,累加器是一组只包含一个空集的集合(
)[[]]
- 在每个步骤中,我们获取累加器中的每个集合,将当前元素
添加到它们中,并将这些结果添加到累加器中x
- 最终结果是一组所有可能的
元素,即功率集n
f
fun f (x, tl) = tl @ map (fn xs => x::xs) tl
现在我们有了[1,2,3]
的跟踪:
ps [1, 2, 3]
~> foldl f [[]] [1, 2, 3] (* Step 1 *)
~> foldl f (f (1, [[]])) [2, 3]
~> foldl f ([[]] @ map (fn xs => 1::xs) [[]]) [2, 3]
~> foldl f [[], [1]] [2, 3] (* Step 2 *)
~> foldl f (f (2, [[], [1]])) [3]
~> foldl f ([[], [1]] @ map (fn xs => 2::xs) [[], [1]]) [3]
~> foldl f [[], [1], [2], [2, 1]] [3] (* Step 3 *)
~> foldl f (f (3, [[], [1], [2], [2, 1]])) []
~> foldl f ([[], [1], [2], [2, 1]] @ map (fn xs => 3::xs) [[], [1], [2], [2, 1]]) []
~> foldl f [[], [1], [2], [2, 1], [3], [3, 1], [3, 2], [3, 2, 1]] [] (* Step 4 *)
~> [[], [1], [2], [2, 1], [3], [3, 1], [3, 2], [3, 2, 1]] (* Final result *)
要正确使用该函数,必须假设输入列表中没有重复项 该功能可理解如下:
- 我们从一个累加器开始,累加器是一组只包含一个空集的集合(
)[[]]
- 在每个步骤中,我们获取累加器中的每个集合,将当前元素
添加到它们中,并将这些结果添加到累加器中x
- 最终结果是一组所有可能的
元素,即功率集n
f
fun f (x, tl) = tl @ map (fn xs => x::xs) tl
现在我们有了[1,2,3]
的跟踪:
ps [1, 2, 3]
~> foldl f [[]] [1, 2, 3] (* Step 1 *)
~> foldl f (f (1, [[]])) [2, 3]
~> foldl f ([[]] @ map (fn xs => 1::xs) [[]]) [2, 3]
~> foldl f [[], [1]] [2, 3] (* Step 2 *)
~> foldl f (f (2, [[], [1]])) [3]
~> foldl f ([[], [1]] @ map (fn xs => 2::xs) [[], [1]]) [3]
~> foldl f [[], [1], [2], [2, 1]] [3] (* Step 3 *)
~> foldl f (f (3, [[], [1], [2], [2, 1]])) []
~> foldl f ([[], [1], [2], [2, 1]] @ map (fn xs => 3::xs) [[], [1], [2], [2, 1]]) []
~> foldl f [[], [1], [2], [2, 1], [3], [3, 1], [3, 2], [3, 2, 1]] [] (* Step 4 *)
~> [[], [1], [2], [2, 1], [3], [3, 1], [3, 2], [3, 2, 1]] (* Final result *)
非常感谢您抽出时间,Pad!非常感谢您抽出时间,Pad!