作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想在换行符上分割一个字符串,我很惊讶我找不到 intercalate "\n"
的反函数.也就是说,一个将字符串拆分为新行(或根据其他谓词)的函数。
请注意 lines
和 words
做一些不同的事情。例如
intercalate "\n" (lines "a\n") == "a"
splitOn
在拆分库中。我也可以自己直接写这样一个函数:
splitOn :: (a -> Bool) -> [a] -> [[a]]
splitOn p = map reverse . g []
where
g rs [] = [rs]
g rs (x:xs) | p x = rs : g [] xs
| otherwise = g (x : rs) xs
最佳答案
正如 Nikita Volkov 指出的那样,“仅 Prelude 功能”的限制并不容易,但这里有一个选择:
splitWhen p [] = [[]]
splitWhen p l = uncurry (:) . fmap (splitWhen p . drop 1) . break p $ l
Functor
(,) a
的实例作为
Control.Arrow.second
的替代品(为了避免更困惑的 lambda 表达式),它无需导入任何东西就可以工作(ghci 说“在 'GHC.Base' 中定义”),但我不确定它是否真的属于
Prelude
,因为我在 Haskell 报告中找不到它。
base
的其他功能甚至对我没有那么大的帮助。在任何情况下,我都会使用
second
而不是
fmap
因为我认为它增加了一点清晰度。与
unfoldr
, 使用
Maybe
让种子将字符串的结尾与空部分(或示例中的空行)区分开来:
import Control.Applicative ((<$>))
import Control.Arrow (second)
import Data.List (unfoldr)
splitWhen p = unfoldr (second check . break p <$>) . Just
where
check [] = Nothing
check (_:rest) = Just rest
-- or cramming it into a single line with 'Data.Maybe.listToMaybe'
splitWhen' p =
unfoldr (second (\rest -> tail rest <$ listToMaybe rest) . break p <$>) . Just
关于string - 如何使用 "intercalate"中的函数实现 "base"的逆(将字符串拆分为字符上的片段)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20750309/
我是一名优秀的程序员,十分优秀!