Хорошо ли использовать выражение case для значения Unit только для использования охранников?

Каков рекомендуемый способ тестирования нескольких булевых выражений?

Я использовал это:

case () of () | test1 -> value1
              | test2 -> value2
              | otherwise -> value3

Это хороший стиль? есть ли более красивый способ?

Ответы

Ответ 1

Этот шаблон можно моделировать с помощью функции - например, cond из Control.Conditional:

signum x = cond [(x > 0     ,  1)
                ,(x < 0     , -1)
                ,(otherwise ,  0)]

Я не могу назвать это особенно красивым.


В следующем GHC мы будем использовать многопользовательский режим, если, hooray! (только что нашел)

f t x = if | l <- length t, l > 2, l < 5 -> "length is 3 or 4" 
           | Just y <- lookup x t        -> y 
           | False                       -> "impossible" 
           | null t                      -> "empty" 

Ответ 2

Это идиома, которую я вижу довольно часто, поскольку у Haskell отсутствует правильный синтаксис для случая без соответствия. Чтобы сделать мои намерения более ясными, я обычно намеренно сопоставляю undefined:

case undefined of
  _ | foo       -> bar
    | baz       -> quux
    | otherwise -> chunkyBacon

Ответ 3

Вы также можете сопоставлять шаблоны в своей серии выражений внутри кортежа

case (test1,test2) of
  (True,_) -> value1
  (_,True) -> value2
  _        -> value3