gpt4 book ai didi

haskell - 如何使用 Haskell 中的理解从嵌套列表中删除空列表

转载 作者:行者123 更新时间:2023-12-01 01:41:50 24 4
gpt4 key购买 nike

我刚开始学习 Haskell,并开始研究理解理解,这使我可以通过为更大的集合提供条件来形成一个子集。

我试图做出一个理解,它采用嵌套列表(包含其他整数列表)并从中删除所有正奇数和空内部列表。

testList= [-3]:[-5,8]:[[1,3,5,7,9],[],[4,6,8,10],[1,3,6,7,9],[],[1]]

removingOnlyPosOdds xxs = [ [x | x <-xs, not (odd x && x > 0 )] | xs <- xxs, [] /= xs ]

testList 在对其应用理解函数之前看起来像:

[[-3],[-5,8],[1,3,5,7,9],[],[4,6,8,10],[1,3,6 ,7,9],[],[1]]

应用removingOnlyPosOdds 测试列表后

The outcome was 
[[-3],[-5,8],[],[4,6,8,10],[6],[]]

所以我意识到函数描述中的 "[]/= xs" 正在删除已经存在的

[]" 仅在 testList 中的内部列表;但不是由于我从内部列表中删除正奇数而形成的新的。

我的下一步应该是什么,以便在代码方面也删除它们?

我希望它看起来像

[[-3],[-5,8],[4,6,8,10],[6]]

有没有一种方法可以概括一下一次完成的理解?

或者是否有另一种方法可以更好地处理事物的删除(如空的内部列表)并制作一个更具体的集合?

最佳答案

您可以添加一些额外的过滤,并使用 let 子句防止两次执行相同的列表理解,例如:

removingOnlyPosOdds xxs = [ ys | xs <- xxs, <b>let ys =</b> [x | x <-xs, not (odd x && x > 0 )], <b>not (null ys)</b>  ]

或者我们可以添加一些额外的过滤,例如:

removingOnlyPosOdds :: Integral i => [[i]] -> [[i]]
removingOnlyPosOdds = <b>filter (not . null)</b> . map (filter (\x -> not (odd x && x > 0)))

甚至更无意义:

import Control.Monad(liftM2)

removingOnlyPosOdds :: Integral i => [[i]] -> [[i]]
removingOnlyPosOdds = filter (not . null) . map (filter (not . liftM2 (&&) odd (>0)))

例如:

Prelude> removingOnlyPosOdds [[-3],[-5,8],[1,3,5,7,9],[],[4,6,8,10],[1,3,6,7,9],[],[1]]
[[-3],[-5,8],[4,6,8,10],[6]]

关于haskell - 如何使用 Haskell 中的理解从嵌套列表中删除空列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55658710/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com