Сегодня я столкнулся с странностью синтаксиса соответствия шаблону 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"
Я не получаю никакой помощи от компилятора. Я думаю, причина в том, что | This | That ->. "A"
не является ярлыком для | This -> "A" | That -> "A"
, хотя он очень похож на него (и я видел много примеров кода, которые рассматривают его как таковые). Вместо этого, из того, что я могу найти, символ трубы используется как для разделения отдельных паттернов, так и для шаблона OR.
Это не большая проблема для большинства DU, но я столкнулся с проблемой при сопоставлении DU с большим количеством случаев в другой DU с небольшим количеством случаев. Моя попытка использовать синтаксис ярлыка вызвала ошибку.
Итак, мои вопросы:
- Является ли моя интерпретация правильной?
- Есть ли какое-либо обходное решение, кроме перечисления каждого шаблона на отдельной строке?