首页 > 解决方案 > 等于参数的最后一个元素之前的切割列表

问题描述

我需要一个函数:

splitOn :: (Eq p) => p -> [p] -> ([p], [p])

以便:


splitOn 'b' ['a', 'b', 'b', 'b', 'c', 'a'] = (['a', 'b', 'b'], ['c', 'a'])
splitOn 'b' ['a', 'b', 'c', 'a'] = (['a'], ['c', 'a'])

传递的参数保证在中间的连续块中。

有没有办法splitOn一次性通过列表?

抱歉,如果这是重复的,我找不到搜索它的方法。

标签: listhaskell

解决方案


首先我们这样做,然后我们这样做,然后我们停止:

splitOn :: Eq a => a -> [a] -> ([a], [a])
splitOn b xs = g xs
  where
  g []                 = ([], [])
  g (x:xs) | x==b      = f xs
           | otherwise = first (x:) $ g xs
  f []                 = ([], [])
  f (x:xs) | x==b      = first (x:) $ f xs
           | otherwise = ([], x:xs)

推荐阅读