我正在撰寫一個從串列中獲取第一個偶數索引的函式。我得到的串列可能包含也可能不包含偶數,如果串列中沒有偶數,我想回傳 -1。該串列可以是無限的。
我寫了這個
posicPrimerPar'' :: [Int] -> Int
posicPrimerPar'' a = fromJust (elemIndex (head (filter (even) a)) a)
我可以做類似的事情:
posicPrimerPar' :: [Int] -> Int
posicPrimerPar' a = case length evens of
0 -> -1;
n -> fromJust elemIndex (head evens) a
where evens = filter (even) a
但正如您所見,這不是最有效的方法。一個串列[1..100000]包含很多偶數,我只需要第一個。我需要 Haskell 的懶惰,所以我需要在那里請求 head,但是當串列為空時 head 會拋出一個空串列例外(即串列中沒有偶數)。我找不到與 Python 的try: ... except: .... 我能找到的關于例外的所有資訊都與 IO 相關。我需要的是except Prelude.head = -1或類似的東西。
uj5u.com熱心網友回復:
Haskell 是懶惰的,因此evens不會被完全評估。有問題的部分是length evens不必要的。您可以使用null :: Foldable f => f a -> Bool或使用模式匹配進行檢查。例如:
import Data.List(findIndex)
posicPrimerPar' :: [Int] -> Maybe Int
posicPrimerPar' [] = Nothing
posicPrimerPar' xs = findIndex even xs
對于findIndex :: (a -> Bool) -> [a] -> Maybe Int,您不需要考慮空串列,因為它已經考慮了這一點。
或者我們可以-1在沒有此類專案的情況下回傳:
import Data.List(findIndex)
import Data.Maybe(fromMaybe)
posicPrimerPar' :: [Int] -> Int
posicPrimerPar' = fromMaybe (-1) . findIndex even
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/450279.html
標籤:哈斯克尔
