我有这样的功能:
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 attribute将
upperface
和其他变量声明为常量:[<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/