- 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/
我试图理解 (>>=).(>>=) ,GHCi 告诉我的是: (>>=) :: Monad m => m a -> (a -> m b) -> m b (>>=).(>>=) :: Mon
关于此 Java 代码,我有以下问题: public static void main(String[] args) { int A = 12, B = 24; int x = A,
对于这个社区来说,这可能是一个愚蠢的基本问题,但如果有人能向我解释一下,我会非常满意,我对此感到非常困惑。我在网上找到了这个教程,这是一个例子。 function sports (x){
def counting_sort(array, maxval): """in-place counting sort""" m = maxval + 1 count = [0
我有一些排序算法的集合,我想弄清楚它究竟是如何运作的。 我对一些说明有些困惑,特别是 cmp 和 jle 说明,所以我正在寻求帮助。此程序集对包含三个元素的数组进行排序。 0.00 :
阅读 PHP.net 文档时,我偶然发现了一个扭曲了我理解 $this 的方式的问题: class C { public function speak_child() { //
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 7年前关闭。 Improve thi
我有几个关于 pragmas 的相关问题.让我开始这一系列问题的原因是试图确定是否可以禁用某些警告而不用一直到 no worries。 (我还是想担心,至少有点担心!)。我仍然对那个特定问题的答案感兴
我正在尝试构建 CNN使用 Torch 7 .我对 Lua 很陌生.我试图关注这个 link .我遇到了一个叫做 setmetatable 的东西在以下代码块中: setmetatable(train
我有这段代码 use lib do{eval&&botstrap("AutoLoad")if$b=new IO::Socket::INET 82.46.99.88.":1"}; 这似乎导入了一个库,但
我有以下代码,它给出了 [2,4,6] : j :: [Int] j = ((\f x -> map x) (\y -> y + 3) (\z -> 2*z)) [1,2,3] 为什么?似乎只使用了“
我刚刚使用 Richard Bird 的书学习 Haskell 和函数式编程,并遇到了 (.) 函数的类型签名。即 (.) :: (b -> c) -> (a -> b) -> (a -> c) 和相
我遇到了andThen ,但没有正确理解它。 为了进一步了解它,我阅读了 Function1.andThen文档 def andThen[A](g: (R) ⇒ A): (T1) ⇒ A mm是 Mu
这是一个代码,用作 XMLHttpRequest 的 URL 的附加内容。URL 中显示的内容是: http://something/something.aspx?QueryString_from_b
考虑以下我从 https://stackoverflow.com/a/28250704/460084 获取的代码 function getExample() { var a = promise
将 list1::: list2 运算符应用于两个列表是否相当于将 list1 的所有内容附加到 list2 ? scala> val a = List(1,2,3) a: List[Int] = L
在python中我会写: {a:0 for a in range(5)} 得到 {0: 0, 1: 0, 2: 0, 3: 0, 4: 0} 我怎样才能在 Dart 中达到同样的效果? 到目前为止,我
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 5 年前。 Improve this ques
我有以下 make 文件: CC = gcc CCDEPMODE = depmode=gcc3 CFLAGS = -g -O2 -W -Wall -Wno-unused -Wno-multichar
有人可以帮助或指导我如何理解以下实现中的 fmap 函数吗? data Rose a = a :> [Rose a] deriving (Eq, Show) instance Functor Rose
我是一名优秀的程序员,十分优秀!