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

时间:2015-02-16 23:09:13

标签: f# conditional-operator

我正在学习来自C#的F#,我只是尝试编写像

这样的表达式
let y = Seq.groupBy (fun x -> (x < p ? -1 : x == p ? 0: 1))

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

4 个答案:

答案 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