Haskell - 用于检测数字是否在范围内的优雅代码

Haskell - Elegant code for detecting if number is in range

我正在写作业,我发现了一段我认为不够优雅的代码..

完全正确:

if n >= min && n <= max 
    then ...
    else ...

我想问一下是否有更优雅的方式来编写这段代码来检查数字是否在范围内 (min, max)

我认为这是开箱即用的最短时间。如果这个问题在您的代码中出现得太频繁以至于变得烦人,您可以按照建议将其提取到一个函数中 here:

(<?) :: Ord a => a -> (a,a) -> Bool
(<?) x (min, max) = x >= min && x <= max

然后用作:

if x <? (min, max) 
    then ... 
    else...

Update: 原来基础包里还有一个函数inRange

(下面的答案只是一个可爱的把戏,我实际上不推荐使用它!)

通过一些技巧,您实际上可以使运算符的行为有点像三元运算符,因此您可以得到很好的代码 "in range"。这是有问题的运算符:

infixr 4 <=!
infixr 4 !<=
(<=!) :: Ord a => a -> (Bool,a) -> Bool
lb <=! (iub, x) = iub && (lb <= x)

(!<=) :: Ord a => a -> a -> (Bool,a)
x !<= ub = (x <= ub, x)

您可以像这样使用它们:

>>> 1 <=! 3 !<= 5
True
>>> 1 <=! 0 !<= 5
False

您甚至可以添加严格关系运算符:

infixr 4 <!
infixr 4 !<
(<!) :: Ord a => a -> (Bool,a) -> Bool
lb <! (iub, x) = iub && (lb < x)

(!<) :: Ord a => a -> a -> (Bool,a)
x !< ub = (x < ub, x)

混合搭配:

>>> 0 <=! 2 !<= 2
True
>>> 0 <=! 2 !<  2
False