簡體   English   中英

在Haskell字符串列表中獲取長度為奇數的元素

[英]Get elements with odd length in a Haskell list of strings

我在Haskell中有一個字符串列表,我需要在另一個列表中獲取具有奇數長度的那些元素。 如何使用較高階的函數(例如foldr,foldl,foldr1,foldl1,filter,map等)完成此操作? 非常感謝您的幫助。 在這種情況下可以使用列表理解嗎?

似乎您已經知道filter存在(因為您已經提到過),但是可能不確定它是如何工作的。 如果您要提取列表的特定子集,這似乎是正確的路徑。 如果查看其類型簽名,您會發現它非常簡單:

(a -> Bool) -> [a] -> [a]

也就是說,它需要一個返回True或False(即包含在新集合中為true,否則為false)並生成新列表的函數。 同樣,Haskell在Prelude中提供了一個稱為odd的功能。 它的簽名如下所示:

Integral a => a -> Bool

也就是說,它可以采用任何Integral類型,如果為奇數,則返回True,否則返回false。

現在,讓我們考慮一個解決方案:

filter odd [1..10]

這將提取[1,10]之間的所有奇數。

我注意到您提到了列表理解。 如果您已經獲得列表,而只是對其進行過濾,則可能不想使用它。 但是,列表理解將是一個完全可以接受的解決方案:

[x | x <- [1..10], odd x]

通常,列表推導用於表示約束更復雜的列表的生成。

現在,實際回答您的問題。 既然我們知道我們可以過濾數字,並且如果我們使用Hoogle搜索以下類型(請注意String就是[Char] ):

[a] -> Int

您將看到一個length函數。 通過一些函數組合,我們可以快速了解如何創建一個過濾奇數長度的函數。 總而言之,我們有一個odd ,其類型為Int- Int -> Bool (在這種情況下), length[a] -> Int或-特別是-String- String -> Int 現在,我們的解決方案如下所示:

filter (odd . length) ["abc","def","eh","123","hm","even"]

你去。

getOddOnes = filter . flip (foldr (const (. not)) id) $ False

注意:如果您上交作業,則最好做好解釋!

暫無
暫無

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

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