Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
F# 是否有一种内联多值比较的方法?_F#_Comparison - Fatal编程技术网

F# 是否有一种内联多值比较的方法?

F# 是否有一种内联多值比较的方法?,f#,comparison,F#,Comparison,我甚至问这个问题都觉得很傻,因为它看起来很琐碎,但我的大脑却让我失望。如果我有以下几点: let a, b, c = 1, 1, 1 是否有一种eligant方法来确定a、b和c是否都具有相同的值。比如: let result = (a = b = c) 这会失败,因为表达式a=b返回true,而下一个表达式的结果是true=c,并抱怨它期望的是int,而不是bool。我唯一能想到的是: a = b && a = c && b = c 当我想添加更多变量时,

我甚至问这个问题都觉得很傻,因为它看起来很琐碎,但我的大脑却让我失望。如果我有以下几点:

let a, b, c = 1, 1, 1
是否有一种eligant方法来确定a、b和c是否都具有相同的值。比如:

let result = (a = b = c)
这会失败,因为表达式
a=b
返回true,而下一个表达式的结果是
true=c
,并抱怨它期望的是int,而不是bool。我唯一能想到的是:

a = b && a = c && b = c
当我想添加更多变量时,这将不起作用

实际上,我想做的是:

let same (x: string * string * string) =
    match x with
    | (a, a, a) -> true
    | _ -> false

我希望我可以将所有元素匹配到一个元素中,如果它们不同,它将继续,但在匹配的第二个元素上显示它已经绑定。

要检查列表中的每个值是否相同:

let same (a, b, c) = a = b && b = c
let rec same = function
  | x::y::_ when x <> y -> false
  | _::xs -> same xs
  | [] -> true

我会尝试使用forall函数来确定所有的数字是否相同

let list = [a; b; c;];;
List.forall (fun n -> n = a) list;;
val it : bool = true

此解决方案完全生成所需的语法。令我惊讶的是,它相当快。此外,is似乎是使用单子的一个很好的例子,也被称为

演出 我真的很喜欢@ildjarn提供的漂亮解决方案,但是构建
List
非常慢,所以我的主要目标是性能。
运行8个比较链,1000万次:

  • 04972ms
    a=b&&a=C&&……
  • 23138ms
    基于列表
  • 12367ms一元

这太好了,我刚开始学习F#,我的大脑又开始乱动,就像C#一样。如果你有某种序列而不是元组,那么这将是微不足道的,但是有了元组,我没有什么好主意。。。还要注意的是,
a=b&&a=c&&b=c
是过度的,可以减少为
a=b&&a=c
,因为如果
a
=
b
a
=
c
,那么
b
显然必须=
c
。如果我使用序列,这将如何实现,也许解决办法是把它们塞进一个序列。我的头在考虑递归地比较未知大小元组中的值。我确信有一种更有效的方法,但是
myseq |>Seq.pairwise |>Seq.forall(fun(a,b)->a=b)
是简单而无痛的(或者
myseq |>Seq.pairwise |>Seq.forall)((
let list = [a; b; c;];;
List.forall (fun n -> n = a) list;;
val it : bool = true
// Generic
let inline mOp1<'a> op sample x = op sample x, sample
let inline mOp2<'a> op1 op2 (b, sample) x = op1 b (op2 sample x), sample

// Implementation for (=) and (&&)
let (==) = mOp1 (=)
let (&=) = mOp2 (&&) (=)

// Use
let ret1 = a == b &= c &= d &= e |> fst
let (|=) = mOp2 (||) (=)
let (.>) = mOp1 (>)
let (&>) = mOp2 (&&) (>)
// Use
let ret2 = a == b |= c |= d |= e |> fst // if any of b,c,d,e equals to a
let ret3 = 5 .> 3 &> 4 |> fst // true: 5>3 && 5>4
let ret4 = 5 .> 3 &> 8 &> 4 |> fst // false