2017-04-06 60 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)在我看來很可讀,並很好地做這項工作。