我正在嘗試撰寫一個函式,該函式
longer :: [a] -> Int -> Bool
決定所提供的串列是否比引數長。到目前為止,我寫道:
longer :: [a] -> Int -> Bool
hossz (x:xs) = length (x:xs)
hossz [] = 0
longer [] _ = False
longer (x:xs) y | y<0 = error ("negative parameter")
| hossz(x:xs)>y = True
| otherwise = False
在我為它提供一個無限串列(例如更長的 [1..] 10)之前,這一切都很好,很花哨,它會卡在某種無限回圈中,只是沒有完成運行。所以問題是,是否有一種方法可以定義它,如果它得到一個無限串列,它只會回傳 True 而不會嘗試計算整個事情?先感謝您
uj5u.com熱心網友回復:
length 正在嘗試計算串列的長度,這對于無限串列需要永遠。
不過,您根本不需要計算長度。您只需要使用較小的整數在尾部遞回。當整數達到 0 時,串列要么為空,要么不為空;多久都沒有關系。
longer :: [a] -> Int -> Bool
longer _ n | n < 0 = True
longer xs 0 = ...
longer [] n = False -- n > 0
longer (x:xs) n = longer xs (n - 1)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/352616.html
標籤:哈斯克尔
