我正在学习来自C#的F#,我只是尝试编写像
这样的表达式let y = Seq.groupBy (fun x -> (x < p ? -1 : x == p ? 0: 1))
但请在表达式中查看“意外的整数文字”。 F#有三元运算符吗?如果没有,我应该使用什么呢?
答案 0 :(得分:48)
是的,它被称为if .. then .. else
事实上在F#中,一切都是表达式,甚至是if .. then .. else
块。
在C#var x = true ? 0 : 1;
在F#let x = if true then 0 else 1
所以在你的情况下:
let y = Seq.groupBy (fun x -> if x < p then -1 else if x = p then 0 else 1)
您可以使用elif
let y = Seq.groupBy (fun x -> if x < p then -1 elif x = p then 0 else 1)
F#中特别考虑的另一个选择是模式匹配:
let f p x =
match x with
| x when x < p -> -1
| x when x = p -> 0
| _ -> 1
let y = Seq.groupBy (f p)
但在你的特殊情况下,我会使用if .. then .. elif .. then。
最后请注意,测试等式运算符与C#中的=
不是==
。
答案 1 :(得分:6)
你也可以使用与使用警卫的函数模式匹配来实现这个:
let y = Seq.groupBy (function |x when x < p -> -1
|x when x = p -> 0
|_ -> 1)
模式匹配可能看起来更长的三元运算符,但是当逻辑变得更复杂时,它们更容易阅读。
答案 2 :(得分:4)
如果您想保存输入,可以自定义
let (?=) (q: bool) (yes: 'a, no: 'a) = if q then yes else no
请注意,您不能在运算符中使用:?=是您可以获得的最近值。
用法:也许?=(“true”,“false”)
答案 3 :(得分:3)
有关F#中C#表达式和语句的更多示例,请参阅this页面。例如:
三元运营商
C#有三元运算符&#34;?:&#34;对于条件表达式:
condition ? trueVal : falseVal
F#具有相同的运算符,但其名称为if-then-else:
if condition then trueVal else falseVal
(注意&#34;如果&#34;在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