1

我已经看到有关缺少拆分功能的其他线程,但我不想偷看,因为我这样做是为了学习目的并想弄清楚自己。所以这里是:

split :: Char -> String -> [String]
split c xs | null f = []
           | otherwise = f : split c s'
  where (f,s) = break (== c) xs
        s' | null s = s
           | otherwise = tail s

它似乎工作正常(请告诉我是否有任何问题)但是当我使用不在字符串中的拆分字符时,该函数返回一个包含原始字符串单个元素的列表,而我希望它返回一个空列表。我不知道该怎么做。

有任何想法吗?。

4

1 回答 1

1

您可以简单地编写一个包装函数,更改原来的结果:

split' x xs = go (split x xs)  where
   go [_] = []
   go ys = ys

有很多方法可以编写拆分函数,例如

split x xs = foldl' go [[]] xs where
   go (ys:yss) y | y == x = []:ys:yss
                 | otherwise = (y:ys):yss    

或者

 import Data.List 

 split x xs = map tail $ groupBy (const (/=x)) (x:xs)
于 2012-04-11T08:27:14.657 回答