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