通过模式匹配交换变量?

时间:2018-11-22 12:57:51

标签: functional-programming ocaml

假设您有2个整数变量a和b 仅当使用匹配表达式a> b时,才如何交换它们? 如果<= b不要交换整数。

使用命令式语言:

dependencies {
    compile project(':c')
 }

在ocaml中执行相同的操作似乎非常困难。

我尝试过

CLASS

我要这样做是因为在下面的函数调用中,我想确保x是两个变量中的较大者。

3 个答案:

答案 0 :(得分:3)

一种简单的方法:

 let swap a b = 
     if (a>b) then (b,a) 
     else (a,b)

但这不等同于C代码,您的C代码正在交换变量的值-这就是命令式语言的工作方式。

在Ocaml中,没有副作用(除非您使用对某些int的引用)。此swap函数将返回一个元组,其成员始终是有序的(第一个成员将始终小于第二个成员)。

答案 1 :(得分:2)

没有状态,您不能“交换”变量的值,因为变量是不可变的。最好的选择是使用元组并在范围内引入新变量。示例:

let diff a b =
    let (min, max) = if a <= b then (a, b) else (b, a)
    in max - min

您当然可以使用相同的标识符并隐藏原始变量:

let diff a b =
    let (a, b) = if a <= b then (a, b) else (b, a)
    in b - a

尽管它对可读性并没有帮助。

答案 2 :(得分:0)

仅供参考,如果您要交换两个引用中的值,则如下所示:

let swap a_ref b_ref =
  let a, b = !a_ref, !b_ref in
  a_ref := b;
  b_ref := a
;;

其类型为val swap : 'a ref -> 'a ref -> unit