将字符匹配到可区分的联合

Matching a character to a discriminated union

我创建了一个有区别的联合,它有三个可能的选项:

type tool =
  | Hammer
  | Screwdriver
  | Nail

我想将单个字符与一个工具选项匹配。我写了这个函数:

let getTool (letter: char) =
    match letter with
    | H -> Tool.Hammer
    | S -> Tool.Screwdriver
    | N -> Tool.Nail

Visual Studio 代码现在向我抛出警告,即只会匹配第一个字符,而其他规则永远不会匹配。

有人可以解释这种行为并提供替代方案吗?

这不是 F# 中字符的表示方式。你写的是变量名,不是字符

要表示字符,请使用单引号:

let getTool (letter: char) =
    match letter with
    | 'H' -> Tool.Hammer
    | 'S' -> Tool.Screwdriver
    | 'N' -> Tool.Nail

除了字符语法(在单引号内 - 参见 ),您应该处理字母不是 H、S 或 N 的情况,使用 option 类型或抛出一个例外(功能较少但足以进行练习):

type Tool =
    | Hammer
    | Screwdriver
    | Nail

module Tool =
    let ofLetter (letter: char) =
        match letter with
        | 'H' -> Hammer
        | 'S' -> Screwdriver
        | 'N' -> Nail
        | _ -> invalidArg (nameof letter) $"Unsupported letter '{letter}'"

用法:

> Tool.ofLetter 'S';;
val it : Tool = Screwdriver

> Tool.ofLetter 'C';;
System.ArgumentException: Unsupported letter 'C' (Parameter 'letter')