我有这样的功能:

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)
        | _ -> ()

我的案例中有一个“此规则永远不匹配”的问题:“'上表面','左表面','前表面','右表面','后表面','下表面'和'_'。”。

我看了这个链接;

f# match expression - "rule will never be matched"

但老实说,我不明白该怎么办。

最佳答案

您无法与变量匹配,我的意思是可以,但是如果这样做,变量将被绑定(bind)到该值,在我看来,这不是您要尝试的操作,否则第一种情况您的代码将“吃掉”所有其他情况,这就是以下规则将永远不匹配的原因。

您可以匹配一个条件:

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

或通过使用literal attributeupperface和其他变量声明为常量:
[<Literal>]
let Upperface  = 4

let RotateFace (face: int, turns: int) =
    match face with
        | Upperface ->
            TiltCube(2)
            TwistCube(turns)
            TiltCube(2)

关于NOT递归函数中的F# "this rule will never be matched"表达式,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27695562/

10-12 00:09
查看更多