如何在haskell中使用splitWhen函数和谓词函数将列表拆分为两个奇偶列表

如何在haskell中使用splitWhen函数和谓词函数将列表拆分为两个奇偶列表,haskell,functional-programming,Haskell,Functional Programming,我是Haskell的新手,我想使用splitWhen函数拆分一个列表,该函数将第一个参数作为布尔条件,根据条件确定列表中的元素是偶数还是奇数。此布尔条件是另一个名为checkeen的函数的返回。但是如何将元素传递给checkEven函数呢。这可能吗 checkEven n=(n mod 2==0) splitList x= splitWhen (checkEven(<???>)) x main =do print (splitList [0,1,2,3,-1]) check偶数

我是Haskell的新手,我想使用splitWhen函数拆分一个列表,该函数将第一个参数作为布尔条件,根据条件确定列表中的元素是偶数还是奇数。此布尔条件是另一个名为checkeen的函数的返回。但是如何将元素传递给checkEven函数呢。这可能吗

checkEven n=(n mod 2==0)
splitList x= splitWhen (checkEven(<???>)) x
main =do 
 print (splitList [0,1,2,3,-1])
check偶数n=(n模2==0)
splitList x=splitWhen(check偶数())x
main=do
打印(拆分列表[0,1,2,3,-1])
如果上述方法错误,请建议其他解决此问题的方法。但我也遇到了同样的问题


提前感谢

不,
splitWhen
无法为您做到这一点,因为它会丢弃delimeters,您需要保留所有输入数据:

splitWhen checkEven [1,2,3,4,6,8,9,10] == [[1],[3],[],[],[9],[]]
您可以使用Data.List.Split库来实现这一点,因为它非常灵活。 只要元素为偶数,我们就可以进行拆分,因此我们在元素为偶数时使用

ghci> :m Data.List.Split
ghci> split (whenElt even) [1,11,2,22,3,33,333,4,6,8,9,99,999,10,100]
[[1,11],[2],[],[22],[3,33,333],[4],[],[6],[],[8],[9,99,999],[10],[],[100],[]]
但我们希望将多个分隔符(如
2,22
)压缩到一个列表中,而不是像现在这样在其中包含奇数的空列表,因此我们使用
压缩
修饰符:

ghci> split (condense $ whenElt even) [1,11,2,22,3,33,333,4,6,8,9,99,999,10,100]
[[1,11],[2,22],[3,33,333],[4,6,8],[9,99,999],[10,100],[]]
但让我们放下最后一张空白列表,因为最后还有一张空白的赔率列表:

ghci> split (dropFinalBlank . condense $ whenElt even) [1,11,2,22,3,33,333,4,6,8,9,99,999,10,100]
[[1,11],[2,22],[3,33,333],[4,6,8],[9,99,999],[10,100]]

另一方面,如果您是从头开始执行此操作,则需要使用
中断
功能。

否,
splitWhen
无法为您执行此操作,因为它会丢弃delimeters,您需要保留所有输入数据:

splitWhen checkEven [1,2,3,4,6,8,9,10] == [[1],[3],[],[],[9],[]]
splitOE::[Integer]->(Integer->Bool)->([Integer],[Integer])
nums=[1,3,5,2,6,7,12,14,9]
splitOE xs preFunc=(a,b)
        where a=[x|x<-xs,preFunc x]
              b=[x|x<-xs,(not.preFunc) x]
main = do 
        print (splitOE nums even)
*Main> main
([2,6,12,14],[1,3,5,7,9])
您可以使用Data.List.Split库来实现这一点,因为它非常灵活。 只要元素为偶数,我们就可以进行拆分,因此我们在元素为偶数时使用

ghci> :m Data.List.Split
ghci> split (whenElt even) [1,11,2,22,3,33,333,4,6,8,9,99,999,10,100]
[[1,11],[2],[],[22],[3,33,333],[4],[],[6],[],[8],[9,99,999],[10],[],[100],[]]
但我们希望将多个分隔符(如
2,22
)压缩到一个列表中,而不是像现在这样在其中包含奇数的空列表,因此我们使用
压缩
修饰符:

ghci> split (condense $ whenElt even) [1,11,2,22,3,33,333,4,6,8,9,99,999,10,100]
[[1,11],[2,22],[3,33,333],[4,6,8],[9,99,999],[10,100],[]]
但让我们放下最后一张空白列表,因为最后还有一张空白的赔率列表:

ghci> split (dropFinalBlank . condense $ whenElt even) [1,11,2,22,3,33,333,4,6,8,9,99,999,10,100]
[[1,11],[2,22],[3,33,333],[4,6,8],[9,99,999],[10,100]]

另一方面,如果您是从头开始实现此功能,则需要使用
中断
功能。

谢谢@AndrewC的回答。我对如何拆分列表感到困惑,并尝试使用内置的splitWhen函数进行拆分。但实际上我找到了一个解决方案,它不使用splitWhen函数,而是使用prelude函数

splitOE::[Integer]->(Integer->Bool)->([Integer],[Integer])
nums=[1,3,5,2,6,7,12,14,9]
splitOE xs preFunc=(a,b)
        where a=[x|x<-xs,preFunc x]
              b=[x|x<-xs,(not.preFunc) x]
main = do 
        print (splitOE nums even)
*Main> main
([2,6,12,14],[1,3,5,7,9])
splitOE::[Integer]->(Integer->Bool)->([Integer],[Integer])
nums=[1,3,5,2,6,7,12,14,9]
splitOE xs preFunc=(a,b)

其中a=[x | x感谢@AndrewC的回答。我对如何拆分列表感到困惑,并尝试使用内置的splitWhen函数进行拆分。但实际上我找到了不使用splitWhen函数而是使用prelude函数的解决方案

splitOE::[Integer]->(Integer->Bool)->([Integer],[Integer])
nums=[1,3,5,2,6,7,12,14,9]
splitOE xs preFunc=(a,b)
        where a=[x|x<-xs,preFunc x]
              b=[x|x<-xs,(not.preFunc) x]
main = do 
        print (splitOE nums even)
*Main> main
([2,6,12,14],[1,3,5,7,9])
splitOE::[Integer]->(Integer->Bool)->([Integer],[Integer])
nums=[1,3,5,2,6,7,12,14,9]
splitOE xs preFunc=(a,b)

其中a=[x | x什么是
splitWhen
?@Jubobs是与list一起工作的内置函数。我在@Jubobs FPComplete的hoogle搜索的包比haskellwiki的多。
splitWhen::(a->Bool)->[a]->[a]
giving
splitWhen(您正在寻找
分区
函数吗?。否则我会熟悉
中断
span
这两种有用的列表解析函数。什么是
splitWhen
?@Jubobs这是一个内置函数,可以处理列表。我在@Jubobs FPComplete的hoogle搜索中找到的包比haskell多。)wiki的
splitWhen::(a->Bool)->[a]->[a]]
giving
splitWhen(您正在寻找
partition
函数吗?。否则我会熟悉
break
span
这两个有用的列表解析函数。