LINUX.ORG.RU

F# match

 


0

4

Может это я туплю, но вроде же всё верно:

match moved |> List.exists (fun a -> wire.Equals(a)) with
| true | _ when wire.length <= 1.0 -> 
    x.scaleWireToElement p lpc wire |> ignore
| false ->
    x.moveWireToElement p lpc wire |> ignore

но валится с incomplete pattern, когда результат true

Да, действительно incomplete pattern.

Значение может быть либо true, либо false. Для false все расписано. Для true здесь расписана только та часть, когда выполняется дополнительное условие в when.

Вот оно и ожидает кейс, где бы обрабатывалось НЕвыполнение условия when.

Не знаю, что именно тебе нужно здесь по логике, но если ничего не нужно делать в случае, когда результат == true но wire.length > 1.0, можно написать так:


match moved |> List.exists (fun a -> wire.Equals(a)) with
| true -> if wire.length <= 1.0 then
            x.scaleWireToElement p lpc wire |> ignore
| false ->
    x.moveWireToElement p lpc wire |> ignore

Совсем в крайнем случае так:


match moved |> List.exists (fun a -> wire.Equals(a)) with
| true | _ when wire.length <= 1.0 -> 
    x.scaleWireToElement p lpc wire |> ignore
| false ->
    x.moveWireToElement p lpc wire |> ignore
| _ -> ()

Если нужно, чтобы при несовпадении с «| true | _ when wire.length <= 1.0 ->» выполнялся тот блок, который сейчас в false, можно так:


match moved |> List.exists (fun a -> wire.Equals(a)) with
| true | _ when wire.length <= 1.0 -> 
    x.scaleWireToElement p lpc wire |> ignore
| _ ->
    x.moveWireToElement p lpc wire |> ignore

amidala ()
Ответ на: комментарий от amidala

ты не понял, вопрос - почему не выполняется OR pattern

The OR pattern is used when input data can match multiple patterns, and you want to execute the same code as a result. The types of both sides of the OR pattern must be compatible.

pseudo-cat ★★★ ()
Ответ на: комментарий от pseudo-cat

я в f# не разбираюсь особо, но вроде бы выражение в вопросе следует воспринимать так:

(true | _) when wire.length <= 1.0 т.е OR выполняется но не важно true или _ всеравно получается матчится только с условием а кейс без условия отсутсвует

strobe ()

Интуиция говорит, что палочку после true надо на следующую строку. Может ошибается.

Kakadu ()
Ответ на: комментарий от strobe

то есть when относится ко всем вышестоящим незавершенным condition имеет меньший приоритет, чем OR. Видимо так оно и есть, но грабли получаются неприятные, теперь нужно держать это в голове

pseudo-cat ★★★ ()
Последнее исправление: pseudo-cat (всего исправлений: 1)

LPC, wire... какое-то железо моделируешь?

tailgunner ★★★★★ ()
Ответ на: комментарий от pseudo-cat

Да, я поняла в том контексте, когда when отностится ко всему первому паттерну.

Это его стандартное поведение. Don Syme как-то упоминал здесь

amidala ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.