我有一个Haskell中的字符串列表,我需要在另一个列表中获取奇数长度的元素。如何使用foldr,foldl,foldr1,foldl1,过滤器,地图等高阶函数来完成这项工作?我将非常感谢你的帮助。在这种情况下可以使用列表理解吗?在Haskell字符串列表中获取奇数长度的元素
0
A
回答
5
看来你知道filter
存在(因为你已经提到过),但可能不确定它是如何工作的。如果你想提取列表的特定子集,这似乎是正确的路径。如果你看一下它的类型签名,你会发现它非常直截了当:
(a -> Bool) -> [a] -> [a]
也就是说,它需要返回true或false(即真正在新的一组包含一个函数,否则为false )并产生一个新的列表。同样,Haskell在Prelude中提供了一个名为odd
的函数。它的签名如下所示:
Integral a => a -> Bool
也就是说,它可以采取任何Integral
类型,如果是奇数,否则为false返回True。
现在,让我们考虑一个解决方案:
filter odd [1..10]
这将提取[1,10]之间的所有奇数。
我注意到你提到了列表解析。如果您已经提供了一个列表,并且您只是简单地对其进行过滤,那么您可能不想使用它。然而,列表理解将是完全可接受的解决方案:
[x | x <- [1..10], odd x]
通常,列表解析被用于表达列表的产生更复杂的约束条件。
现在,实际回答你的问题。因为我们知道,我们可以过滤数字,如果我们使用Hoogle搜索以下类型(注意String
简直是[Char]
):
[a] -> Int
你会看到一个length
功能。用一些函数组合,我们可以很快看到如何创建一个过滤奇数长度的函数。总之,我们有odd
这是Int -> Bool
(在这种情况下),我们有length
这是[a] -> Int
或 - 特别是 - String -> Int
。我们的解决方案现在看起来像这样:
filter (odd . length) ["abc","def","eh","123","hm","even"]
1
在这里你去。
getOddOnes = filter . flip (foldr (const (. not)) id) $ False
注意:如果你把这个作为你的功课,你最好准备好解释它!
相关问题
- 1. 获取奇数长度字符串中的中间字符
- 2. 获取奇数长度字符串的中间三个字符
- 3. Haskell和字符串长度
- 4. 在JS中获取字符串长度
- 5. 在StringWriter中获取字符串长度?
- 6. 获取列表中列出的元素的长度中的R
- 7. 获取数组中元素的长度
- 8. 如何在PHP中获取字符串的像素长度?
- 9. 获取UTF8中字符串的长度
- 10. 获取C++中字符串的长度
- 11. 获取字符串的字节长度
- 12. 如何获取字符串数组的字符串长度?
- 13. 如何在数据表的每列中获取最大字符串长度
- 14. Python:binascii.a2b_hex给出“奇数长度字符串”
- 15. 如何切分列表元素(获取列表元素的子字符串)?
- 16. 如果长度奇数,如何在字符串数组元素的中间字符中打印*
- 17. 获取数组中最长字符串的长度
- 18. 获取列表的长度作为字符串
- 19. 获取字符串/列表中的第一个元素
- 20. 硒:获取列表中的元素含量为字符串
- 21. 获取Svg中字符串的像素长度
- 22. 在大多数字符的列表中获取元素
- 23. Haskell - 如何获取列表中的列表元素?
- 24. PowerShell 2.0获取字符串的长度
- 25. 如何$从数组中拉元素,$元素的字符串长度>大数?
- 26. Haskell的字符串列表
- 27. 获取元素从字符串数组
- 28. ArrayList:获取最长字符串的长度,获取字符串的平均长度
- 29. 如何获取字符串长度
- 30. Vb.net获取子字符串长度
虽然可爱,你的'isOddLength'部分是不必要的复杂。沿着同样的路线,更加直截了当的解决方案是'getOddOnes = filter $ foldr(const not)False' – Cactus
@Cactus,我认为有理由更喜欢左折叠,而这个答案是为了匹配在某种意义上的问题。 – dfeuer