编写以下内容的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)
答案 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个参数来构建您的函数。