Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.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#_Conditional Operator - Fatal编程技术网

F#是否具有三元数?:运算符?

F#是否具有三元数?:运算符?,f#,conditional-operator,F#,Conditional Operator,我正在学习F#来自C#,我刚刚尝试编译一个表达式,如 let y = Seq.groupBy (fun x -> (x < p ? -1 : x == p ? 0: 1)) 让y=Seq.groupBy(乐趣x->(x0时的x | _ -> 1 设y=Seq.groupBy(fp) 但在你的特殊情况下,我会使用if。。然后。。埃利夫。。那么 最后请注意,test equality操作符是=而不是=,如在C#中所示。您还可以使用模式匹配和使用保护的函数来实现这一点: let

我正在学习F#来自C#,我刚刚尝试编译一个表达式,如

let y = Seq.groupBy (fun x -> (x < p ? -1 : x == p ? 0: 1))
让y=Seq.groupBy(乐趣x->(x

但请参阅“表达式中意外的整数文字”。F#有三元运算符吗?如果没有,我应该用什么来代替呢?

是的,它被称为
If。。然后。。其他

事实上,在F#中,一切都是一个表达式,甚至是一个
if。。然后。。else

在C#
var x=true中?0 : 1; 

在F#
中,让x=如果为真,则0否则1

因此,在你的情况下:

let y = Seq.groupBy (fun x -> if x < p then -1 else if x = p then 0 else 1)

另一种选择,特别是当你有超过2种情况时,要考虑模式匹配:

let f p x =
    match x with
    | x when x < p -> -1
    | x when x = p ->  0
    | _ -> 1

let y = Seq.groupBy (f p)
设f p x=
将x与
|当x-1时的x
|x=p->0时的x
| _ -> 1
设y=Seq.groupBy(fp)
但在你的特殊情况下,我会使用if。。然后。。埃利夫。。那么


最后请注意,test equality操作符是
=
而不是
=
,如在C#中所示。

您还可以使用模式匹配和使用保护的函数来实现这一点:

    let y = Seq.groupBy  (function |x when x < p -> -1
                                   |x when x = p -> 0
                                   |_ -> 1)
设y=Seq.groupBy(x-1时函数| x
|x=p->0时的x
|_ -> 1)
模式匹配看起来可能更长,但当逻辑变得更复杂时,它们更容易阅读。

有关F中C表达式和语句的更多示例,请参阅第页。例如:

三值运算符

对于条件表达式,C#具有三元运算符“?:”:

condition ? trueVal : falseVal 
F#具有相同的运算符,但其名称为if-then-else:

if condition then trueVal else falseVal
(请注意,“if”在F#中的使用频率远低于C#;在F#中,许多条件表达式是通过模式匹配而不是if-then-else完成的。)

开关语句

C#有一个switch语句。它看起来像这样:

switch (x) 
{ 
    case 1: 
        SomeCode(); 
        break; 
    default: 
        SomeCode(); 
        break; 
} 
在F#中,这只是模式匹配更简洁地表达的许多事情之一:

    match x with 
     | 1 -> SomeCode() 
     | _ -> SomeCode()  // _ is a ‘catch all’ default

如果要保存键入内容,可以定义自己的

let (?=) (q: bool) (yes: 'a, no: 'a) = if q then yes else no
请注意,您不能使用:in运算符,因此?=是您可以获得的最近值


用法:可能?=(“真”、“假”)

不相关,但为此,您可能只想使用
x.CompareTo(p)
,它适用于大多数类型,其中
@Reed Copsey肯定不是完全不相关,但是与我的学习目标有点相切。:)是的,只是与三元功能无关-但是写
(fun x->x.CompareTo(p))
imo:)@ReedCopsey In F#你可以使用函数
compare
,所以
(fun x->compare px)
也可以写成
compare p
,但是
(fun x->compare xp)
变成
(-)>>compare-p)
它的可读性不比lambda;)在表达式
if x
中,我们如何知道
else
属于哪个“if”呢?它对应于前面的if或elif。这与合并多个相同?:在C#中,由于
if..then..else
是一个表达式,因此
then
else
分支需要具有相同的类型。如果
then
子句的计算结果为
unit
,则只能跳过
else
。是。它们必须是相同类型的事实也适用于
?:在C#@Enigmativity中,它实际上属于他们两个。if表达式可以有零个或多个elif分支,因此
if a then x elif b then y else z
是单个
if
表达式。另一方面,
如果a那么x else如果b那么y else c
是一个
if
表达式,
then
分支本身就是第二个
if
表达式。将其与未编译的
进行比较。对于包含
if
表达式的
then
分支,
if
表达式需要放在括号中:
if a then(if b then x else y)else z
。这与C#条件运算符相反。您可以去掉所有类型注释,而不需要注释:let(?=)(q)(yes,no)=如果q,那么yes,否则不小心:这将急切地评估真和假两个方面,而不管条件如何!也就是说,
如果为true,则printf“a”否则printf“b”
将只打印
a
,但
true?=(printf“a”,printf“b”)
将打印
ab
let (?=) (q: bool) (yes: 'a, no: 'a) = if q then yes else no