這是冗長,我不一定建議寫這樣如此簡單的功能(IMO匹配&遞歸模式是大量清) 。但是,這裏有一個漂亮的聲明管道:
import Control.Error
import Data.List
deadline :: (Num a, Ord a) => a -> [a] -> a
deadline time = fromMaybe 0 . findDeadline time
findDeadline :: (Num a, Ord a) => a -> [a] -> Maybe a
findDeadline time xs = decayWithDifferences time xs
>>= findIndex (< 0)
>>= atMay xs
decayWithDifferences :: Num b => b -> [b] -> Maybe [b]
decayWithDifferences time = tailMay . scanl (-) time
-- > deadline 6 [4, 1, 5, 6]
-- 5
此文檔的代碼位和原則讓你測試好一點,雖然IMO這些功能適合更多或更少進入「明顯正確」的範疇。
您可以驗證它匹配的實現:
import Test.QuickCheck
prop_equality :: [Int] -> Int -> Bool
prop_equality time xs = test xs time == deadline time xs
-- > quickCheck prop_equality
-- +++ OK, passed 100 tests.
只是想象*你有一個更高階的函數可以幫助解決這個問題。那個更高階的函數會做什麼?你能告訴我們你將如何使用它來解決問題嗎? –
而不是一個評論的問題:解決這個問題的最佳方法是TS提供的算法嗎?我的意思是,所有答案都要貴得多,不是嗎? – kaan
@kaan TS是什麼意思? – Sibi