我目前正在通过The Craft of Functional Programming 2nd Edition工作,我被赋予了一项任务,可以编写一个让我难以理解的功能。
该函数将三个数字作为参数并返回一个布尔结果,即
between :: Int -> Int -> Int -> Bool
如果n在n和p之间,则定义为m n p之间为真。为简单起见,在2 2 2之间,函数将返回true,3 3 5之间也将返回true。
数学上,x <= y且y <= z
这个问题还建议我可以编写一个weakAscendingOrder函数来检查数字序列在任何时候都不会出现故障。我写了这个函数,我的代码如下所示:
weakAscendingOrder :: Int -> Int -> Int -> Bool
weakAscendingOrder x y z = (x <= y) && (y <= z)
如何在使用或不使用weakAscendingOrder的情况下编写一个between函数,同时保留函数签名,因为它们是由本书提供的?
答案 0 :(得分:0)
评论二是完全正确的。 weakAscendingOrder
函数的行为与您希望between
的行为完全相同。以下是一些其他实现方式:
between x y z --using guards
|x <= y = y <= z
|otherwise = False
between x y z = if (x <= y) then (y <= z) else False --using if
between x y z = case (x <= y) of True -> (y <= z) --using case syntax
False -> False
然而(x<=y)&&(y<=z)
在我看来非常易读并能很好地完成工作。