F#是否具有三元数?:运算符?
我正在学习F#来自C#,我刚刚尝试编译一个表达式,如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
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