Ответ 1
Используйте блок для пустого побочного эффекта:
match list with
| [] -> printfn "Empty!"
| _ -> ()
Как я могу написать оператор no-op в F #?
В частности, как я могу улучшить второе предложение следующего оператора соответствия:
match list with
| [] -> printfn "Empty!"
| _ -> ignore 0
Используйте блок для пустого побочного эффекта:
match list with
| [] -> printfn "Empty!"
| _ -> ()
Ответ от Стрингера, конечно, правильный. Я подумал, что может быть полезно прояснить, как это работает, потому что "()" не действительно пустое утверждение или пустой побочный эффект...
В F # каждый действительный фрагмент кода является выражением. Такие конструкции, как let
и match
, состоят из нескольких ключевых слов, шаблонов и нескольких подвыражений. Графика F # для let
и match
выглядит так:
<expr> ::= let <pattern> = <expr>
<expr>
::= match <expr> with
| <pat> -> <expr>
Это означает, что тело let
или тело предложения match
должно быть некоторым выражением. Это может быть какой-то вызов функции, такой как ignore 0
, или это может быть какое-то значение. В вашем случае это должно быть какое-то выражение типа unit
, потому что printfn ".."
также имеет тип unit
.
Тип unit
- это тип, который имеет только одно значение, которое записывается как ()
(а также означает пустой кортеж без элементов). Это действительно несколько похоже на void
в С#, за исключением того, что void
не имеет никаких значений.
BTW: Следующий код может выглядеть как последовательность операторов, но это также выражение:
printf "Hello "
printf "world"
Компилятор F # неявно добавляет ;
между двумя строками, а ;
- оператор секвенирования, который имеет следующую структуру: <expr>; <expr>
. Это требует, чтобы первое выражение возвращало unit
и возвращает результат второго выражения.
Это немного удивительно, когда вы исходите из фона С#, но это делает langauge удивительно элегантным и consise. Он никоим образом не ограничивает вас - вы можете, например, написать:
if (a < 10 && (printfn "demo"; true)) then // ...
(Этот пример не очень полезен - просто демонстрация гибкости)