- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在尝试学习 OCaml,但我仍然对折叠函数有些吃力。我做了一些研究,发现以下代码片段(用 Scala 编写)使用 foldleft 实现插入排序。我想我明白了,但我对 Scala 完全一无所知,所以我仍然需要一些澄清。所以,我想我的问题有两个(哈,明白了吗?),这个函数如何用 Ocaml 编写,它实际上是如何工作的?
def insertionSort[A <% Ordered[A]](list: List[A]): List[A] =
list.foldLeft(List[A]()) { (r,c) =>
val (front, back) = r.span(_ < c)
front ::: c :: back
}
感谢您的帮助!
最佳答案
正如我在上面评论的那样,这不是一种特别好的排序方式(假设我了解 Scala 代码,但我可能不了解)。这是它似乎在做什么的 OCaml 翻译:
let insertion_sort l =
let add1 sortedl x =
let le, gt = List.partition ((>=) x) sortedl
in
le @ [x] @ gt
in
List.fold_left add1 [] l
当你写了一段时间的 FP 代码后,折叠就变得很自然了。目的是以已知顺序(例如,最左边的优先)处理来自数据结构(例如,列表)的一系列元素,同时维护在您进行处理时传递的某些状态。在最简单的情况下(如此处),状态也是您的最终答案。在其他情况下,您需要携带一些额外的状态以及最终答案。在这些情况下,您可以在最后提取最终答案。
也许我不应该这么说,但是折叠就像 C 系列中的 for(;;)
语句,只是它封装了您计划在循环中修改的所有状态.通过这种方式,它是一种很好控制的迭代形式。
通信看起来像这样:
for(state = S, x = first(D); more(D); x = next(D)) { state = E(state, x) }
fold_left (fun state x -> E state x) S D
封装修改后的状态的原则通常在您习惯后会非常有用。很多时候,您折叠的函数(如上面的 add1)在许多其他情况下都是有用的,因为折叠的结构需要在那个地方有一个普遍有用的函数。
请特别注意,fold 函数包含了如何遍历数据结构的所有知识。 folded 函数只需要知道如何处理每个元素。因此,您可以自由更改数据结构(和折叠)而无需更改任何其他代码。您还可以对不同的数据结构使用相同的折叠函数(add1
)。
关于algorithm - 理解 List.fold_left 并使用它实现插入排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12334058/
我一直在努力思考 fold_left 和 fold_right。作为练习,我一直在尝试重写 fold_left 和 fold_right 中的很多函数来加强我的知识。例如,在查找列表的平均值时,我会使
我试图找到浮点数列表的平均值。 let avg l = List.fold_left ( +. ) 0 l /. List.length l;; List.fold_left 如何工作? (将
我可以通过以下代码找到列表的最后一个元素。 let last (xs:'a list) : 'a = let rec aux xs prev = match xs with
编写一个 Ocaml 函数 list_print : string list -> unit 从左到右打印列表中的所有字符串: 假设我有一个 Ocaml 函数 list_print: string l
我正在尝试学习 OCaml,但我仍然对折叠函数有些吃力。我做了一些研究,发现以下代码片段(用 Scala 编写)使用 foldleft 实现插入排序。我想我明白了,但我对 Scala 完全一无所知,所
我想知道如何在 Ocaml 中构建一个函数,该函数使用 List.fold_left 找出列表中是否存在元素。 例子: exists 3 [1;2;3;4;5] => true 这个函数的类型是:a
我正在试验 Core 的 List.fold_left。 # List.fold_left;; - : 'a Core.Std.List.t -> init:'b -> f:('b -> 'a ->
我想使用 fold_left 编写简单的插入排序函数,但我也想传递在我的排序乐趣中指定顺序的函数。我不知道的是如何将它传递给 fold_left.. let rec insert f l e = ma
我想遍历一个多 map ( map 的 map ),例如:map>在boost hana的帮助下。 lambda 函数 at不能采用引用类型 &map (编译错误:非常量引用),因此,我无法在 mul
我是一名优秀的程序员,十分优秀!