Ответ 1
В case ()
нет ничего плохого; это лучшее, что у вас есть для этого случая использования, если вы не хотите использовать очень свежие синтаксические и нестандартные расширения, такие как GHC multi-way-if.
Сегодня я обнаружил, что набираю следующий код:
case () of
_ | x < 15 -> ...
_ | x < 25 -> ...
_ | x < 50 -> ...
_ -> ...
Смысл этого достаточно прямолинейный, но он просто чувствует... неправильно произносить case ()
. Кто-нибудь имеет лучшее предложение?
Я полагаю, что, когда я занимаюсь брендингом x
, я мог бы написать case x
. Но это все равно оставляет меня ничем, чтобы на самом деле совпадало с шаблоном; это все о охранниках. И это все еще кажется странным.
В case ()
нет ничего плохого; это лучшее, что у вас есть для этого случая использования, если вы не хотите использовать очень свежие синтаксические и нестандартные расширения, такие как GHC multi-way-if.
Другие отметили, что 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
Вы можете использовать ленивую оценку, чтобы придумать что-то вроде этого:
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