簡體   English   中英

如何將未知長度的列表傳遞給 haskell function?

[英]How can I pass a list of unknown length to a haskell function?

secondTest :: [(Int, Int)] -> [Int] -> [Int]
secondTest a b = [ x | (m,n) <- a, x <- b,  m > 3 && n > 3]

我現在有這段代碼,我想更改它以便在所有給定的 int 都超過 3 時返回 b,無論第一個列表中給出了多少個 int。

我試過這樣的事情:

secondTest :: [Int] -> [Int] -> [Int]
secondTest a b = [ x | m <- a, x <- b,  m > 3]

但如果任何int 值大於 3,而不是全部,這將返回一個值。

編輯以顯示預期回報:

secondTest [4,4] [1,2] = [1,2]
secondTest [4,4,4] [1,2] = [1,2]
secondTest [4,1,4] [1,2,9] = Nothing

謝謝

您可以使用all測試a的所有元素是否都大於 3:

secondTest :: [Int] -> [Int] -> [Int]
secondTest a b
   | all (> 3) a = b 
   | otherwise   = ...

請注意,在otherwise情況下,我們仍然必須返回一個列表,因此我們不能返回Nothing 我們可以返回一個空列表

secondTest a b
   | all (> 3) a = b 
   | otherwise   = []

或者我們可以更改 function 的返回類型

secondTest :: [Int] -> [Int] -> Maybe [Int]
secondTest a b
   | all (> 3) a = Just b 
   | otherwise   = Nothing

您不能直接使用列表理解來執行此操作。 充其量,您可以使用一個生成<= 3的元素列表,然后測試它是否為空,反轉邏輯:

secondTest a b
   | null [ x | x <- a, x <= 3 ] = Nothing
   | otherwise                   = Just b

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM