Является ли .. еще .. идиоматическим способом написания вещей на F #? - PullRequest
5 голосов
/ 26 января 2012

Каким будет 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 ]

10 голосов
/ 26 января 2012

Для одного if ... then ... else ... Я бы, наверное, оставил это так, если бы у вас было больше дел, я бы использовал сопоставление с шаблоном и когда охрана:

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

или вы также можете посмотреть на активные шаблоны: http://msdn.microsoft.com/en-us/library/dd233248.aspx

2 голосов
/ 30 января 2012

Каким будет F # идиоматический способ написать следующее? Или вы бы оставили это как есть?

Нет ничего плохого в том, как вы это написали, но вот еще одна альтернатива (вдохновленная Huusom):

let input = 5
let result =
  if input>0 && input<5 then [A; B] else [C]
  |> Seq.averageBy (fun f -> f input)
1 голос
/ 27 января 2012

Это небольшое изменение стиля, но я нахожу это более читабельным:

let input = 5
let result = 
     if input > 0 && input < 5 then
         (calculateA input + calculateB input) / 2
     else
         calculateC input
0 голосов
/ 26 января 2012

Это не совсем ответ, потому что Роберт прав. Но похоже, что вы работаете с рядом функций, поэтому вы можете написать это так:

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 параметра.

...