F#, как записать пустого оператора

Как я не могу записать никакой-op оператор в F#?

А именно, как может я улучшать второй пункт следующего оператора соответствия:

match list with
    | [] -> printfn "Empty!"
    | _ -> ignore 0
17
задан Guy Coder 29 February 2016 в 14:55
поделиться

2 ответа

Используйте единицу для пустого побочного эффекта:

match list with
  | [] -> printfn "Empty!"
  | _ -> ()
30
ответ дан 30 November 2019 в 10:58
поделиться

Ответ от Stringer , конечно, правильный. Я подумал, что может быть полезно прояснить, как это работает, потому что «()» на самом деле не является пустым оператором или пустым побочным эффектом ...

В F #, каждый допустимый фрагмент кода является выражением ]. Такие конструкции, как позволяют и соответствовать , состоят из некоторых ключевых слов, шаблонов и нескольких подвыражений. Грамматика F # для let и соответствует выглядит следующим образом:

<expr> ::= let <pattern> = <expr>
           <expr>
       ::= match <expr> with
           | <pat> -> <expr>

Это означает, что тело let или тело предложения соответствует должно быть какое-то выражение. Это может быть вызов функции, такой как ignore 0 , или какое-то значение - в вашем случае это должно быть какое-то выражение типа unit , потому что printfn ".." также относится к типу unit .

Тип unit - это тип, который имеет только одно значение, которое записывается как () (и это также означает пустой кортеж без элементов). Это действительно несколько похоже на void в C # за исключением того, что void не имеет никаких значений.

Кстати: следующий код может выглядеть как последовательность операторов, но это также и выражение:

printf "Hello "
printf "world"

Компилятор F # неявно добавляет ; между двумя строками и ; - это оператор последовательности, имеющий следующую структуру: ; <выражение> . Это требует, чтобы первое выражение возвращало unit и возвращало результат второго выражения.

Это немного удивительно, если вы начинаете работать с C #, но это делает язык удивительно элегантным и понятным. Это никоим образом не ограничивает вас - вы можете, например, написать:

if (a < 10 && (printfn "demo"; true)) then // ...

(Этот пример бесполезен - просто демонстрация гибкости)

16
ответ дан 30 November 2019 в 10:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: