Проверьте пустое место и верните логическое значение - PullRequest
0 голосов
/ 09 октября 2018

Я создал список, в котором есть некоторые значения, я пытаюсь найти среднее значение списка.Есть ли более умный способ сделать это и как я могу проверить наличие пустого пространства / списка, например, так [.] и вернуть логическое «ложь»?

let gennemsnit = List.average [0.0; 0.1; 0.3; 0.4; 1.0; 1.1; 1.1; 1.2; 1.5; 2.0]
     if Array.contains then 
         printfn "false"
     else 
         printfn "%f" gennemsnit

Ответы [ 2 ]

0 голосов
/ 09 октября 2018

В дополнение к использованию типа Option, предложенного dumetrulo, вы можете использовать тип Result для описания ваших бизнес-ошибок в зависимости от конкретного домена.Например, вы можете определить тип, который перечисляет ожидаемые вами случаи ошибок, включая пустой список или любые другие ваши правила (допустим, вы не хотите допускать никаких отрицательных значений в списке), а затем вернуть Error с конкретным случаем ошибки или Ok со значением:

type AggregateError =
| ListIsEmpty
| ListContainsNegativeValues

let average = function
| [] -> Error ListIsEmpty
| list when list |> List.exists ((>) 0.0) -> Error ListContainsNegativeValues
| values -> Ok <| List.average values

Здесь, если вы запустите average для пустого списка, вы получите Error ListIsEmpty.

average [];;

val it : Result<float,AggregateError> = Error ListIsEmpty

Если вы запустите average для списка, который содержит одно или несколько отрицательных значений, вы получите Error ListContainsNegativeValues.

average [1.0; -1.0];;

val it : Result<float,AggregateError> = Error ListContainsNegativeValues

В противном случае вы получите Ok с фактическим средним значением:

average [0.0; 1.0; 3.0; 5.0];;

val it : Result<float,AggregateError> = Ok 2.25
0 голосов
/ 09 октября 2018

Если я правильно понимаю, вы хотите вычислить среднее значение списка с плавающей запятой, но вернуть указание на отсутствие среднего значения в случае, если список значений пуст.Это верно?Если это так, вы не можете вернуть среднее значение или логическое значение…, но вы можете вернуть дополнительное значение:

let average = function
    | [] -> None
    | values -> Some (List.average values)

average [0.0; 0.1; 0.3; 0.4; 1.0; 1.1; 1.1; 1.2; 1.5; 2.0]
|> printfn "%A"

average []
|> printfn "%A"

Выход:

"F# Compiler for F# 4.0 (Open Source Edition)

Some 0.87
<null>

РЕДАКТИРОВАТЬ: вывод <null> происходит из-за оптимизации компилятора, которая представляет None как null.

...