これは冗長であり、このような単純な関数を記述することは必ずしもお勧めしません (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.