将字符匹配到可区分的联合
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')
我创建了一个有区别的联合,它有三个可能的选项:
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
除了字符语法(在单引号内 - 参见 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')