Объявление функции с использованием функции в F # - PullRequest
0 голосов
/ 08 января 2019

Я пытаюсь понять следующий код для объявления функции:

let string_of_int = function
    | 0 -> "zero"
    | 1 -> "one"
    | 2 -> "two"
    | _ -> "many"

что совпадает с

let string_of_int2 x = match x with
    |0 -> "zero"
    |1 -> "one"
    | 2-> "two"
    _ -> "many

Я понимаю, Второй способ объявления функции - попытка сопоставить вход x с несколькими возможными вариантами. Но я не понимаю первый способ сделать это. Что делает ключевое слово function?

Кроме того, что делает 'a' .. 'z' в следующем коде?

let is_capital = function
    | 'a'..'z' -> false
    | 'A'..'Z' -> true
    |_  -> failwith "Not a valid letter"

Почему у меня не может быть такой функции:

let examplefunc = function
    |"string"-> Printf.printf "a string"
    |3 -> Printf.print "an integer"
    |true-> Printf.printf "a boolean"
    |- -> Printf.printf "whatever"

1 Ответ

0 голосов
/ 08 января 2019

Ключевое слово function представляет собой вариант fun, который учитывает, что поведение функции часто напрямую зависит от значения аргумента. Например, если мы начнем со следующего определения факториальной функции:

 For a positive integer n, n! is 1 if n = 0, and n * (n-1)! otherwise

тогда естественный перевод на OCaml

let factorial = function
| 0 (* if n = 0 *) -> 1
| n (* otherwise *) -> n * factorial (n-1)

как вы сказали это строго эквивалентно

let factorial = fun n -> match n with
| 0 (* if n = 0 *) -> 1
| n (* otherwise *) -> n * factorial (n-1)

но когда аргумент функции немедленно деконструируется при сопоставлении с образцом, может быть более читабельным использовать function напрямую.

Что касается '0'..'9', то это шаблон диапазона, который соответствует всем символам (т. Е. '0'|'1'|'2'|'3'|'4'|..| '9' между нижней и верхней границами (включенными) диапазона (в соответствии с порядком символов ascii)

  let is_digit = function '0'..'9' -> true | _ -> false
  is_digit '0' (* returns true *);;
  is_digit 'a' (* returns false *);;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...