0

我的基本想法是实现一种冒泡类型('a list -> 'a list)sorted我使用的是和的变量result。如果我更改列表中的某些元素,则sorted变为 1。否则,sorted仍为 0。Result是比较的一个周期。

我认为我的sorted变量有问题。谁能弄清楚问题是什么?

let rec sort (l: int list) : int list =
    let sorted=0 in
    let result = match l with
           | []->[]
           | x::xs-> if xs=[] then x
                     else let y::ys = xs in
                          if x<y then x::sort(xs)
                          else let sorted=1 in
                               y::sort(x::ys)
    in
    if sorted=0 then result
    else sort(result)
4

2 回答 2

4

在我看来,您正试图将其sorted用作可变变量。OCaml 变量是不可变的。一旦将变量绑定到值,就无法更改绑定。您的每个let sorted =语句都定义了一个名为 的变量sorted。因此,您的最后一个测试将始终显示 sorted 等于 0。它正在测试 sorted 的第一个定义,它永远不会有任何其他值而不是 0。

于 2013-04-09T14:01:39.920 回答
1

正如 Jeffrey 所说,OCaml 值是不可变的。这就是为什么您的程序无法按预期工作的原因。

但是您的代码还有其他问题:

  • sorted应该有类型bool,没有int。OCaml 的优点之一是它具有强大的类型系统,因此请使用它。
  • 要解构列表,您应该只使用模式匹配if xs=[] then x else let y::ys = xs in不是这样做的好方法(OCaml 应该警告您您的模式匹配并不详尽)。您应该将其他情况添加到您的模式匹配中。

像这样:

| [] -> []
| x::[] -> x
| x::y::ys -> ...
于 2013-04-10T10:11:51.427 回答