繁体   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