[英]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.