Хорошо ли использовать выражение 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