2016-08-04 116 views
4

我想要一个简单的函数,它会给出相反的值 - 如果v == v1,返回v2;如果v == v2,则返回v1。我试过如下:f#模式匹配相反的值

let oppose v v1 v2 = 
    match v with 
    | v1 -> v2 
    | v2 -> v1 
    | _ -> "" 

但是,我得到的警告:

warning FS0026: This rule will never be matched 
warning FS0026: This rule will never be matched 

和预期它不工作:

> oppose "a" "a" "b" 
val it : string = "b" 
> oppose "b" "a" "b" 
val it : string = "b" 

我希望得到 “A”在第二个电话。我究竟做错了什么?

回答

3

match子句中使用的名称是分配给结果的名称,而不是对该值的检查。您需要明确检查:

let oppose v v1 v2 = 
    match v with 
    | a when a = v1 -> v2 
    | b when b = v2 -> v1 
    | _ -> "" 

您也可以使用if代替匹配。这可以是简单的阅读,如果你核对值,在这种情况下:

let oppose v v1 v2 = 
    if v = v1 then v2 
    elif v = v2 then v1 
    else "" 
+3

也许你应该添加的if/elif的/其他方式做到这一点是在这种情况下,比比赛更合适,作为@nafu似乎开始它的F#旅程? – Sehnsucht

+1

@Sehnsucht当然;)容易添加 –

+1

谢谢! 之前从未被称为“it”:) – nafu