Я не совсем знаком с F #, но в Haskell операторы case позволяют вам сопоставлять шаблоны, связывая переменные с частями выражения.
case listExpr of
(x:y:_) -> x+y
[x] -> x
_ -> 0
В теоретическом случае, что Хаскелл допускает то же самое:
Поэтому было бы проблематично разрешить множественные привязки
case listExpr of
(x:y:_) | [z] -> erm...which variables are bound? x and y? or z?
В редких случаях это может работать при использовании одной и той же привязки:
unEither :: Either a a -> a
unEither val = case val of
Left v | Right v -> v
И, как в приведенном вами примере, он может работать нормально, если вы только сопоставляете литералы и ничего не связываете:
case expr of
1 | 0 -> foo
_ -> bar
Тем не менее:
Насколько я знаю, у Haskell такой синтаксис отсутствует. Однако у него есть стражники, как уже упоминали другие.
Также обратите внимание:
Использование |
в операторе case выполняет другую функцию в Haskell. Заявление после | действует как охранник.
case expr of
[x] | x < 2 -> 2
[x] -> 3
_ -> 4
Так что, если такой синтаксис должен быть введен в Haskell, ему придется использовать что-то отличное от |
. Я бы предложил использовать ,
(кому захочется добавить это в спецификацию Haskell.)
unEither val = case val of
Left v, Right v -> v
В настоящее время выдается «ошибка разбора на входе ,
»