use*_*248 0 haskell higher-order-functions
我在Haskell中有一个字符串列表,我需要在另一个列表中获取奇数长度的元素.如何使用更高阶函数(如foldr,foldl,foldr1,foldl1,filter,map等)来完成此操作?我非常感谢你的帮助.在这种情况下可以使用列表理解吗?
你似乎意识到filter存在(因为你已经提到过),但也许不确定它是如何工作的.如果您尝试提取列表的特定子集,这似乎是正确的路径.如果你看一下它的类型签名,你会发现它非常简单:
(a -> Bool) -> [a] -> [a]
Run Code Online (Sandbox Code Playgroud)
也就是说,它需要一个返回True或False的函数(即true包含在新集合中,否则为false)并生成一个新列表.类似地,Haskell提供了一个odd在Prelude中调用的函数.它的签名如下:
Integral a => a -> Bool
Run Code Online (Sandbox Code Playgroud)
也就是说,它可以采用任何Integral类型,如果是奇数则返回True,否则返回false.
现在,让我们考虑一个解决方案:
filter odd [1..10]
Run Code Online (Sandbox Code Playgroud)
这将提取[1,10]之间的所有奇数.
我注意到你提到了列表理解.如果您已经获得了一个列表并且只是过滤它,那么您可能不想使用它.但是,列表理解将是一个完全可以接受的解决方案:
[x | x <- [1..10], odd x]
Run Code Online (Sandbox Code Playgroud)
通常,列表推导用于表示具有更复杂约束的列表的生成.
现在,实际回答你的问题.由于我们知道我们可以过滤数字,如果我们使用Hoogle搜索以下类型(通知String很简单[Char]):
[a] -> Int
Run Code Online (Sandbox Code Playgroud)
你会看到一个length功能.通过一些函数组合,我们可以快速了解如何创建一个过滤奇数长度的函数.总之,我们有odd它的类型Int -> Bool(在这种情况下),我们有length这是[a] -> Intor-- specifically-- String -> Int.我们现在的解决方案如下:
filter (odd . length) ["abc","def","eh","123","hm","even"]
Run Code Online (Sandbox Code Playgroud)