簡體   English   中英

您如何檢測列表中Haskell中是否恰好有3個項目?

[英]How do you detect if a list has exactly 3 items in Haskell?

我有這個,但是我得到一個錯誤:

-- test if a list contains exactly three characters
test :: [Char] -> Bool
test xs   | [_ , _ , _] = True
          | otherwise = False

模式匹配發生在垂直條的左側 從而:

test :: [Char] -> Bool
test [_, _, _] = True
test _         = False

正如Norman Ramsey在下面正確指出的那樣,以下代碼不是一個健壯的替代解決方案(因為將其應用於(長)有限列表時效率非常低,並且不會在無限列表上停止),因此不應使用:

test :: [Char] -> Bool
test xs = length xs == 3

此外, length xs == 0應該始終替換為null xs

編輯:自然而然出現的問題是: 我們如何對此進行概括? 如果我們要測試列表是否恰好具有n個元素怎么辦? 如果輸入可能是無限的怎么辦? 這是一個成本為n或列表長度(以較小者為准)的解決方案,這是漸近有效的解決方案,正如我們可能希望的那樣:

hasLength :: Int -> [a] -> Bool
hasLength n []     = n == 0
hasLength 0 (x:xs) = False
hasLength n (x:xs) = hasLength (n-1) xs

用法:

*Main> hasLength 3 [1..2]
False
*Main> hasLength 3 [1..3]
True
*Main> hasLength 3 [1..4]
False
*Main> hasLength 3 [1..] 
False

以負長度調用此函數是不安全的 如果列表是無限的,該函數將不會終止;如果列表是有限的,則它將返回False ,其成本與列表的長度成比例。 一個簡單的解決方法是預先檢查(僅在第一次調用時) n是否為負數,但是此解決方法會使代碼難看。

暫無
暫無

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

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