当函数不为真时,我想切片我的列表,但我不知道我必须在其他情况下给予回报。你知道吗?
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])
获取列表满足/不满足给定谓词的最长前缀。因此,您可以使用它来创建两个相互调用的函数sliceBy
和sliceByNot
:
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
需要填写…
部分的地方。因此,这两个函数应该相互调用。