当函数在haskell中不为真时,我如何才能只切片列表?



当函数不为真时,我想切片我的列表,但我不知道我必须在其他情况下给予回报。你知道吗?

Example : 
sliceBy odd [1..5] == [[1],[2],[3],[4],[5]]
sliceBy odd [1,3,2,4,5,7,4,6] == [[1,3],[2,4],[5,7],[4,6]]
sliceBy even [1,3,2,4,5,7,4,6] == [[],[1,3],[2,4],[5,7],[4,6]]
sliceBy :: (a -> Bool) -> [a] -> [[a]]
sliceBy _ []  = []
sliceBy _ [x] = [[x]]
sliceBy f (x:xs)
| f x   = [x] : sliceBy f xs
| otherwise = ?? 

您可以使用span :: (a -> Bool) -> [a] -> ([a], [a])andbreak :: (a -> Bool) -> [a] -> ([a], [a])获取列表满足/不满足给定谓词的最长前缀。因此,您可以使用它来创建两个相互调用的函数sliceBysliceByNot:

sliceBy :: (a -> Bool) -> [a] -> [[a]]
sliceBy _ [] = []
sliceBy f xs = … : …
where (xp, xnp) =spanf xs
sliceByNot :: (a -> Bool) -> [a] -> [[a]]
sliceByNot _ [] = []
sliceByNot f xs = … : …
where (xnp, xp) =breakf xs

需要填写部分的地方。因此,这两个函数应该相互调用。

最新更新