2016-06-22 3 views
17

Сегодня я столкнулся с странностью в синтаксисе соответствия шаблону F #, что может привести к явным сбоям в проверке полноты.Неоднозначность в синтаксисе соответствия шаблону

type Thing = 
    | This 
    | That 
    | Other 

let useThing = 
    function 
    | This -> "A" 
    | That -> "A" 
    | That -> "B" // compiler complains 
    | Other -> "B" 

В приведенном выше сценарии компилятор помогает мне, что второе Это правило никогда не будет согласовано. Однако, если бы я попытался сделать код более компактным и написал

let useThing = 
    function 
    | This | That -> "A" 
    | That | Other -> "B"  

Я не получают никакой помощи от компилятора. I думаю причина в том, что | This | That ->. "A" не является ярлыком для | This -> "A" | That -> "A", хотя он очень похож на него (и я видел много примеров кода, которые рассматривают его как таковые). Вместо этого, из того, что я могу найти, символ трубы используется как для разделения отдельных паттернов, так и для шаблона OR.

Это не большая проблема для большинства DU, но я столкнулся с проблемой при отображении DU с большим количеством случаев в другой DU с небольшим количеством случаев. Моя попытка использовать синтаксис ярлыка вызвала ошибку.

Так что мои вопросы:

  1. Является ли моя интерпретация правильно?
  2. Есть ли какое-либо обходное решение, кроме перечисления каждого шаблона на отдельной строке?

ответ

8

Ваша интерпретация верна.

Выходом из действия для первого This и второго That вы создаете шаблон, или как описано в Pattern Matching (F#)

Для меня это немного сбивает с толку, тоже, так как логическое «или» является || в F #. И в то время как легко видеть, первый бар как new alternative и второй бар как or в вашем форматировании становится менее очевидной в

let useThing = 
    function 
    | This 
    | That -> "A" 
    | That 
    | Other -> "B" 

Однако компилятор может сказать, является ли это бесполезно в целом картина, но она не может упростить картину , That | Other имеет действительное совпадение и, следовательно, не является избыточным, как считает компилятор.
Вы можете думать о гораздо более привлекательных шаблонах, где было бы совершенно неясно, если части могут быть опущены или как их упростить.

Смежные вопросы