Haskell 相当于 Ruby 的 slice_when
Haskell equivalent of Ruby's slice_when
我是 Haskell 的新手,我想要一个类似于 Ruby 的 slice_when 的函数:
slice_when
Ruby
a = [1,2,4,9,10,11,12,15,16,19,20,21]
b = a.slice_when {|i, j| i+1 != j }
p b.to_a #=> [[1, 2], [4], [9, 10, 11, 12], [15, 16], [19, 20, 21]]
Haskell
ghci > slice_when (\x y -> x+1 /= y) [1,2,4,9,10,11,12,15,16,19,20,21]
=> [[1, 2], [4], [9, 10, 11, 12], [15, 16], [19, 20, 21]]
非常感谢。
这是一个 sliceWhen
我相信可以如您所愿的实现:
sliceWhen :: (a -> a -> Bool) -> [a] -> [[a]]
sliceWhen _ [] = []
sliceWhen _ [x] = [[x]]
sliceWhen f (x:y:xs)
| f x y = [x] : sliceWhen f (y:xs)
| otherwise = let z:zs = sliceWhen f (y:xs)
in (x:z) : zs
上述函数在每个边界上运行提供的谓词,如果它 returns True
,它会创建一个接缝。否则,它将“当前”值附加到列表其余部分的第一个元素上。
没有显式递归,使用 NonEmpty
:
import Data.List.NonEmpty
sliceWhen :: (a -> a -> Bool) -> [a] -> [NonEmpty a]
sliceWhen p = foldr f []
where
f z [] = [z :| []]
f z gss@(gs@(x :| xs) : xss) = if p z x
then (z :| []) : gss
else cons z gs : xss
我是 Haskell 的新手,我想要一个类似于 Ruby 的 slice_when 的函数:
slice_when Ruby
a = [1,2,4,9,10,11,12,15,16,19,20,21]
b = a.slice_when {|i, j| i+1 != j }
p b.to_a #=> [[1, 2], [4], [9, 10, 11, 12], [15, 16], [19, 20, 21]]
Haskell
ghci > slice_when (\x y -> x+1 /= y) [1,2,4,9,10,11,12,15,16,19,20,21]
=> [[1, 2], [4], [9, 10, 11, 12], [15, 16], [19, 20, 21]]
非常感谢。
这是一个 sliceWhen
我相信可以如您所愿的实现:
sliceWhen :: (a -> a -> Bool) -> [a] -> [[a]]
sliceWhen _ [] = []
sliceWhen _ [x] = [[x]]
sliceWhen f (x:y:xs)
| f x y = [x] : sliceWhen f (y:xs)
| otherwise = let z:zs = sliceWhen f (y:xs)
in (x:z) : zs
上述函数在每个边界上运行提供的谓词,如果它 returns True
,它会创建一个接缝。否则,它将“当前”值附加到列表其余部分的第一个元素上。
没有显式递归,使用 NonEmpty
:
import Data.List.NonEmpty
sliceWhen :: (a -> a -> Bool) -> [a] -> [NonEmpty a]
sliceWhen p = foldr f []
where
f z [] = [z :| []]
f z gss@(gs@(x :| xs) : xss) = if p z x
then (z :| []) : gss
else cons z gs : xss