Сегодня я столкнулся с странностью в синтаксисе соответствия шаблону 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 с небольшим количеством случаев. Моя попытка использовать синтаксис ярлыка вызвала ошибку.
Так что мои вопросы:
- Является ли моя интерпретация правильно?
- Есть ли какое-либо обходное решение, кроме перечисления каждого шаблона на отдельной строке?