Digit
не тип.
ParsedItem
является типом, но Digit
- нет, и также не являются Operator
, Alpha
и NotParsed
.
Используя этот синтаксис, вы определили тип ParsedItem
, значения которого могут быть четырех видов: Digit
, Operator
, Alpha
или NotParsed
.
Вы можете создать новые значения типа ParsedItem
, указав, какой аромат вы хотите создать, и любые параметры, которые требует аромат (в вашем случае все вкусы имеют один char
параметр), например:
let item1 = Digit 'a'
let item2 = Operator 'b'
// and so on
В этом примере значения item1
и item2
являются значениями типа ParsedItem
. Это не значения разных типов.
Если у вас есть значение типа ParsedItem
, вы можете выяснить, какой это вкус, сопоставив шаблон:
let whatIsIt item =
match item with
| Digit c -> "It's a digit!"
| Operand c -> "It's an operand!"
| Alpha c -> "It's an alpha!"
| NotParsed c -> "Not parsed :-/"
printfn "%s" (whatIsIt item1) // prints "It's a digit!"
printfn "%s" (whatIsIt item2) // prints "It's an operator!"
Если при написании сопоставления с образцом вы пропустите аромат, компилятор поймает вас:
let whatIsIt item =
match item with
| Digit c -> "It's a digit!"
// Warning: incomplete pattern match
С этим предупреждением компилятор говорит вам: «Я вижу, вы определили, что делать, если item
окажется Digit
, но что я должен делать с остальными тремя разновидностями?»
Это то, что происходит и в вашем коде: вы сопоставляете шаблон с Digit d
, но вы не указали, что делать с другими вариантами.
Теперь я не знаю, чего вы здесь добиваетесь, и ваш код выглядит бессмысленным (по причинам, описанным выше), поэтому лучшее, что я могу сделать, это объяснить, что вы неправильно понимаете в синтаксисе языка. Если вы уточните свою реальную цель, я могу предложить правильный способ ее кодирования.