2015-03-01 7 views
2

Нет ли более чистого способа сделать это?Как упростить этот код F #

let Triplets = List.zip3 A B C 
let T1 (x, _, _) = x 
let T2 (_, x, _) = x 
let T3 (_, _, x) = x 
let Best = List.maxBy T3 Triplets 
T1 Best,T2 Best // return to C# code 
+1

Это больше подходит для [CodeReview.SE] (http://codereview.stackexchange.com). – ildjarn

+1

@ildjarn Нет, к сожалению, это не так. Этот код является фрагментированным фрагментом кода, здесь нет никакого контекста, и нет описания того, что делает код, это считается «примером кода», который является не по теме для обзора кода. –

+0

Я здесь довольно новый. Вы, ребята, говорите, что мой вопрос нигде не подходит? Я думал, что это хороший стиль, чтобы вырезать код для сообщения. Что касается кода, я думал, что вполне очевидно, что он объединяет 3 списка, находит максимум и возвращает 2 элемента максимума. –

ответ

1

Главное улучшение заключается в использовании сопоставления шаблонов для извлечения данных из кортежей.

Я бы с чем-то по следующим направлениям (показано как функция под названием myFunc, который я назвал с примерами данных, чтобы проверить мое понимание вашего намерения):

let A = [1; 2; 3] 
let B = [4; 5; 6] 
let C = [6; 7; 6] 

let myFunc A B C = 
    let triplets = List.zip3 A B C 
    match List.maxBy (fun (_, _, x) -> x) triplets with 
    | (a, b, _) -> (a, b) 

let result = myFunc A B C //returns (2, 5) 

Вы могли бы сократить myFunc еще быть обжигающе определение triplets в List.maxBy, но в какой-то стоимости читаемости, например: предложение

let myFunc A B C = 
    match List.zip3 A B C |> List.maxBy (fun (_, _, x) -> x) with 
    | (a, b, _) -> (a, b) 

phoog в уберет соответствие:

let myFunc A B C = 
    let (a, b, _) = List.zip3 A B C |> List.maxBy (fun (_, _, x) -> x) 
    (a, b) 
+1

еще один вариант: 'let (a, b, _) = List.maxBy (fun (_, _, x) -> x) triplets в a, b' - в многострочном примере, замените' in' Конечно, ключевое слово с символом новой строки. – phoog