我有一個具有初始值y 的函式的問題,然后串列[x] 函式需要對 y 和串列??的所有元素求和,并且如果 y 在開始時低于零(如果 y 在開始時小于 0,沒有任何操作)行程或在行程結束時它回傳 True。我想出了這個,但它不起作用。感謝幫助。
isOverdrawn :: Integer -> [Integer] -> Bool
isOverdrawn y [] = y < 0
isOverdrawn y (_:xs) = y isOverdrawn xs
isOverdrawn 100 [-99, -2, 1000] ~>* True
isOverdrawn 0 [0, 24, -42] ~>* True
isOverdrawn 0 [] ~>* False
uj5u.com熱心網友回復:
isOverdrawn :: (Num a, Ord a) => a -> [a] -> Bool
isOverdrawn y [] = y < 0
isOverdrawn y (x:xs) = y' < 0 || isOverdrawn y' xs where
y' = y x
您的代碼有幾個問題:
- 在每個步驟中,您都想檢查是否
y低于零,因此您必須進行這樣的測驗。 - 您需要在每一步都添加每個
x,y但在模式中(_:xs)您只是忽略了單個xes。 - 該函式
isOverdrawn需要 2 個引數,但在這種情況下您只傳入一個引數isOverdrawn xs。
uj5u.com熱心網友回復:
您可以為此使用any和scanl函式。該any函式接受一個串列和一個串列元素型別的謂詞,并回傳該串列的任何元素上的謂詞是否為真。該scanl函式使用給定的操作和起始值將串列的所有元素組合在一起,并回傳所有中間值的串列以及最終答案。像這樣組合它們:
isOverdrawn :: (Ord a, Num a) => a -> [a] -> Bool
isOverdrawn y xs = any (< 0) (scanl ( ) y xs)
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/335036.html
下一篇:KVM添加虛擬顯卡渲染3D圖形
