F #, как написать пустой оператор

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

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

match list with
    | [] -> printfn "Empty!"
    | _ -> ignore 0

Ответы

Ответ 1

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

match list with
  | [] -> printfn "Empty!"
  | _ -> ()

Ответ 2

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

В 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 // ...

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