Как преобразовать «строку» в «параметр <string>» - PullRequest
7 голосов
/ 04 июня 2009

У меня есть функция, объявленная как

let GetLength (value : option<string>) = 
    if value.IsSome then value.Value.Length else 0

И у меня есть переменная

let a : string = "tom"

Как передать функцию GetLength?

Ответы [ 4 ]

11 голосов
/ 11 июня 2009

Принятый ответ не компилируется, а выдает ...

GetLength Some a;;

^^^^^^^^^^^^^^ ошибка FS0003: это значение не является функцией и не может быть применено

F # считает, что вы создаете функцию (GetLength Some) для применения к значению a. Это потому, что это функциональный язык.

Правильная форма

GetLength (Some a);;
8 голосов
/ 04 июня 2009

Вы не разыгрываете это. Вам нужно использовать конструктор Some:

GetLength Some a
5 голосов
/ 13 июля 2009

Альтернатива скобкам:

GetLength <| Some a

Я думаю, что важно ответить на этот вопрос:

Зачем кому-то желающему набрать 18 токены более 3-х линий, когда вы можете получить точно так же, используя 12 жетонов на одной линии?

Написание кода - это не только лаконичность, но и удобочитаемость и ремонтопригодность. Предположим, вам нужно обработать случай, когда a равен null. С сопоставлением с образцом вы можете пойти из этого:

let GetLength (value : string option) =
    match value with
    | Some s -> s.Length
    | _ -> 0

К этому:

let GetLength (value : string option) =
    match value with
    | Some s when s <> null -> s.Length
    | _ -> 0

Для программиста на F # смысл понятен. Для исправления ваша реализация будет выглядеть примерно так:

let GetLength (value : option<string>) = 
    if value.IsSome && value.Value <> null then value.Value.Length else 0

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

Хорошо, если сопоставление с образцом не резонирует с вами, но дополнительные «затраты» в простом случае часто компенсируются много раз по мере развития логики.

3 голосов
/ 13 июля 2009

Чтобы ответить на общий вопрос о приведении 'a к option<'a>, если вы хотите сделать это безопасно, без применения объекта к конструктору Some, есть простая функция, которую я бы использовал:

let to_option = function
  | null -> None
  | obj -> Some obj
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...