2017-04-06 61 views
1

我目前正在通过函数式编程第二版的Craft工作,并且我已经介绍了一个写入函数的任务,这个函数一直困扰着我。在Haskell中编写一个数字函数

该函数采用三个数字作为参数,并返回一个布尔结果即

between :: Int -> Int -> Int -> Bool 

它被定义使得之间m×n个p为真,如果n是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,同时保留功能的签名,因为他们已经被这本书提供的?

+1

在这种情况下,“之间”是什么意思?用数学符号写出来(使用>,<,<=,> =) – Lazersmoke

+5

在我看来,你的'weakAscendingOrder'正好是你的'between'函数。如果'y'介于'x'和'z'之间,那么'x> = y'('y'至少是'x'),'y <= z'('y'至多是'z')这正是'weakAscendingOrder'所说的。 – user2407038

+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)在我看来很可读,并很好地做这项工作。