Использование случая для многоразового использования

Сегодня я обнаружил, что набираю следующий код:

case () of
  _ | x < 15 -> ...
  _ | x < 25 -> ...
  _ | x < 50 -> ...
  _          -> ...

Смысл этого достаточно прямолинейный, но он просто чувствует... неправильно произносить case (). Кто-нибудь имеет лучшее предложение?

Я полагаю, что, когда я занимаюсь брендингом x, я мог бы написать case x. Но это все равно оставляет меня ничем, чтобы на самом деле совпадало с шаблоном; это все о охранниках. И это все еще кажется странным.

Ответы

Ответ 1

В case () нет ничего плохого; это лучшее, что у вас есть для этого случая использования, если вы не хотите использовать очень свежие синтаксические и нестандартные расширения, такие как GHC multi-way-if.

Ответ 2

Другие отметили, что case если штраф и mutli-way, если существует, но я бы пошел на локальную функцию через оператор where или let:

someFunction = do
    x <- monadicOp
    let f y | y < 5  = expr1
            | y < 15 = expr2
            | y < 25 = expr3
            | True   = expr4
    f x

Это синтаксически чище, чем решение case case и более переносимое, чем многоканальное, если.

EDIT:

Если неясно, если сравниваемое значение x в этом случае уже находится в области действия, когда вы определяете охраняемую функцию (f), тогда вы можете просто определить значение вместо:

someFunction = do
    x <- monadicOp
    let r | x < 15 = expr1
          | x < 25 = expr2
    r

Ответ 3

Вы можете использовать ленивую оценку, чтобы придумать что-то вроде этого:

import Data.List
import Data.Maybe
import Control.Applicative

cases :: [(Bool,a)] -> a -> a
cases lst d = snd $ fromJust $ (find fst lst) <|> Just (True,d)

main = do
  let x = 20
      r = cases [(x < 15, putStr "15"),
                 (x < 25, putStr "25"),
                 (x < 50, putStr "50")] $ putStr "None"
    in
       r