Можно ли оптимизировать сопоставление с шаблоном кода в одной строке? - PullRequest
0 голосов
/ 24 февраля 2019

Мне интересно, есть ли способ написать эту строку, не передавая h в функцию calcVol дважды?

| h :: t when (h |> calcVol) > maxVol -> maxLoop t (h |> calcVol) 

Где h - кортеж, содержащий три измерения, а calcVol возвращает значение с плавающей запятой.

Я знаю, что мог бы явно определить значение vol как:

| h :: t -> let vol = calcVol h if vol > maxVol then...

Мне интересно, есть ли способ сделать это красиво в одной строке?

Ответы [ 2 ]

0 голосов
/ 25 февраля 2019

При использовании активных шаблонов решение может выглядеть следующим образом:

let calcVol v = v

let (|MaxVol|) maxVol = function
| [] -> (maxVol, [])
| h :: t -> ((max (calcVol h) maxVol), t)

let rec maxLoop list m =
    match list with
    | [] -> m
    | MaxVol m (c, t) -> maxLoop t c

let vs = [ -1; 42; 3 ]

maxLoop vs System.Int32.MinValue // 42

Другая возможность с лучшей читаемостью может состоять в том, чтобы сначала вычислить объемы (например, с помощью map ping), а затем найти максимум.Трудно сказать без полного кода ...

0 голосов
/ 24 февраля 2019

Если бы все значения vol были перед стрелкой, вы могли бы сделать это:

| h :: t when let vol = (h |> calcVol) in vol > maxVol -> // Something

Но let назначения в предложении when слева от стрелки не переносятся направая сторона.Демонстрация:

let f x = x + 5
let l = [1; 2]
match l with
| a :: b when let y = f a in y = 6 -> "Six"
| _ -> "Other"

Это работает и возвращает "Six".Но:

let f x = x + 5
let l = [1; 2]
match l with
| a :: b when let y = f a in y = 6 -> sprintf "Six = %d" y
| _ -> "Other"

Это не работает, выдавая ошибку:

ошибка FS0039: значение или конструктор 'y' не определены.

Так что, к сожалению, у вас не может быть нужной однострочной версии , и вам придется пойти на более длинный подход (с let, за которым следует if, как вы продемонстрировали во второй половине своего ответа).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...