2017-01-25 9 views
6

Во-первых, я новичок в f #, поэтому, возможно, ответ очевиден, но я его не вижу. Поэтому у меня есть некоторые кортежи с идентификатором и значением. Я знаю идентификатор, который я ищу, и я хочу выбрать правильный кортеж из трех, которые я передаю. Я собирался сделать это с двумя утверждениями соответствия, один вложенными в другой, но все зависит от первое правило. В этом примере я сократил его до двух кортежей, так как это показывает мою проблему. Компилятор дает предупреждение «правило никогда не будет соответствовать», но я не понимаю, почему.F # соответствие шаблону с правилом кортежей никогда не будет соответствовать

let selectTuple tupleId tuple1 tuple2 = 
    match tuple1 with 
    | (tupleId, _) -> tuple1 
    | _ -> tuple2 

Любая помощь или предложения по лучшему способу сделать это были бы очень признательны.

ответ

6

Используйте when положение:

let selectTuple tupleId tuple1 tuple2 = 
    match tuple1 with 
    | (x, _) when x = tupleId -> tuple1 
    | _ -> tuple2 

Что происходит здесь является то, что при использовании tupleId как часть корпуса матча, вы ввести новое значение, называемое tupleId, что Вы можете обратиться на правой стороне случай матча. Это тени вашего аргумента функции.

Поскольку вы фактически только указываете имя первому элементу кортежа, любой кортеж будет соответствовать первому случаю, и вы получите предупреждение «правило не будет соответствовать» на втором.

+0

Отлично, спасибо большое! Теперь, когда я вижу это, это имеет смысл, поскольку это выражение соответствия также имеет обязательную силу. – Jesse