Сравнение шаблонов с переменной List - PullRequest
0 голосов
/ 29 октября 2018

Почему второе сопоставление с образцом возвращает «1 и 2» и выдает предупреждение «Это правило никогда не будет совпадать» с подстановочным знаком _?

let a = [3;4]

match a with
    |[1;2] -> "1 and 2"
    |_ -> "Other"
|> printfn "%A"

let lst = [1;2]
match a with
    |lst -> "1 and 2"
    |_ -> "Other"
|> printfn "%A"

Мне кажется, это считается правдой. Как так?

Ответы [ 2 ]

0 голосов
/ 29 октября 2018

Во втором сопоставлении с образцом у вас есть две разные переменные lst с одинаковыми именами. Здесь

let lst = [1;2]
match a with
    | lst -> "1 and 2"
    | _ -> "Other"

в первом случае совпадения вы не ссылаетесь на переменную lst выше, вы создаете новую. Вы можете проверить это, попытавшись изменить его имя (F2 в Visual Studio). Как объясняет AMieres, дело важно.

В общем, обращение к переменной в случае совпадения выполнимо, но не тривиально. Рассмотрим этот код:

let helloWorld = "hello world"

let isHelloWorld s =
    match s with
    | helloWorld -> true
    | _ -> false

Здесь вы получите такое же предупреждение, как описано. Один из способов - пометить константу атрибутом [<Literal>] и одновременно сделать ее заглавной:

[<Literal>]
let HelloWorld = "hello world"

let isHelloWorld s =
    match s with
    | HelloWorld -> true
    | _ -> false

Это будет работать как ожидалось. Однако вы можете применить атрибут [<Literal>] только к определенным типам , и список не входит в их число. Для этого вы должны использовать условия when в случаях совпадения.

0 голосов
/ 29 октября 2018

Идентификатор в нижнем регистре совпадает со всем и привязывает идентификатор к значению.

Если вы хотите сравнить lst с a, вам нужно использовать when, который является условной защитой:

let a = [3;4]

match a with
    |[1;2] -> "1 and 2"
    |_ -> "Other"
|> printfn "%A"

let lst = [1;2]
match a with
    | b when b = lst -> "1 and 2"
    |_ -> "Other"
|> printfn "%A"

но в этом случае простой if then else будет работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...