如果.. else ..在F#写一些东西的惯用方法?

时间:2012-01-26 09:27:46

标签: f# functional-programming

编写以下内容的F#惯用方法是什么?或者你会保留原样吗?

let input = 5
let result = 
     if input > 0 && input  < 5 then
         let a = CalculateA(input)
         let b = CalculateB(input)
         (a+b)/2
     else
         CalculateC(input)

4 个答案:

答案 0 :(得分:10)

对于一个if ... then ... else ...,我可能会这样离开,如果你有更多的情况,我会使用模式匹配与守卫:

let result =
    match input with
    | _ when input > 0 && input < 5  -> ...
    | _ -> ...

或者您可能还想查看有效模式:http://msdn.microsoft.com/en-us/library/dd233248.aspx

答案 1 :(得分:2)

  

编写以下内容的F#惯用方法是什么?或者你会保留原样吗?

你写它的方式没有错,但这是另一种选择(受Huusom启发):

let input = 5
let result =
  if input>0 && input<5 then [A; B] else [C]
  |> Seq.averageBy (fun f -> f input)

答案 2 :(得分:1)

这是一种轻微的风格变化,但我发现它更具可读性:

let input = 5
let result = 
     if input > 0 && input < 5 then
         (calculateA input + calculateB input) / 2
     else
         calculateC input

答案 3 :(得分:0)

这不是一个真正的答案,因为罗伯特是正确的。但看起来你正在使用一系列函数,所以你可以这样写:

let Calculate input =
    let calc = function | [f] -> f input | fl -> fl |> List.map ((|>) input) |> List.sum |> (fun s -> s / fl.Length)
    if input > 0 && input < 5
        then calc [CalculateA; CalculateB]
        else calc [CalculateC]

您可以使用此签名分解为某些内容:((int -> int) list) -> ((int -> int) list) -> (int -> bool) -> int -> int,然后通过应用前3个参数来构建您的函数。