在NOT递归函数中,F#"此规则永远不会匹配"表达式

yus*_*suf 8 f# pattern-matching

我有这样一个功能:

let RotateFace (face: int, turns: int) =
    match face with
        | upperface -> 
            TiltCube(2)
            TwistCube(turns)
            TiltCube(2)
        | leftface -> 
            TiltCube(3)
            TwistCube(turns)
            TiltCube(1)
        | frontface -> 
            TurnCube(1)
            TiltCube(3)
            TwistCube(turns)
            TiltCube(1)
            TurnCube(3)
        | rightface -> 
            TiltCube(1)
            TwistCube(turns)
            TiltCube(3)
        | backface -> 
            TiltCube(3)
            TwistCube(turns)
            TiltCube(1)
        | downface -> 
            TurnCube(3)
            TiltCube(3)
            TwistCube(turns)
            TiltCube(1)
            TurnCube(1)
        | _ -> ()
Run Code Online (Sandbox Code Playgroud)

在我的案例"'上面','左脸','前脸','右脸','背面','下脸'和'_'上,我有一个"这条规则永远不会匹配"的问题."

我看过这个链接;

f#match表达式 - "规则永远不会匹配"

但说实话,我不明白我的情况应该怎么做.

Gus*_*Gus 8

你无法匹配一个变量,我的意思是你可以,但是如果你这样做会发生什么,变量将被绑定到该值,在我看来,这不是你想要做的,否则第一个案例在您的代码将"吃掉"所有其他情况,这就是为什么永远不会匹配以下规则.

您可以匹配条件:

let RotateFace (face: int, turns: int) =
    match face with
        | x when x = upperface -> 
            TiltCube(2)
            TwistCube(turns)
            TiltCube(2)
Run Code Online (Sandbox Code Playgroud)

upperface使用literal属性声明和其他变量作为常量:

[<Literal>]
let Upperface  = 4

let RotateFace (face: int, turns: int) =
    match face with
        | Upperface -> 
            TiltCube(2)
            TwistCube(turns)
            TiltCube(2)
Run Code Online (Sandbox Code Playgroud)

  • 好的,我想我找到了答案.它不是`Literal`,它的模式匹配需要它们是大写的:*在模式匹配表达式中,以小写字符开头的标识符总是被视为要绑定的变量,而不是文字,所以你通常应该使用初始大写字母你定义文字.* (2认同)
  • 另一种选择是使这些值成为枚举. (2认同)