Как я не могу записать никакой-op оператор в F#?
А именно, как может я улучшать второй пункт следующего оператора соответствия:
match list with
| [] -> printfn "Empty!"
| _ -> ignore 0
Используйте единицу для пустого побочного эффекта:
match list with
| [] -> printfn "Empty!"
| _ -> ()
Ответ от 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 // ...
(Этот пример бесполезен - просто демонстрация гибкости)