gpt4 book ai didi

string - 如何使用 "intercalate"中的函数实现 "base"的逆(将字符串拆分为字符上的片段)?

转载 作者:行者123 更新时间:2023-12-04 22:47:01 26 4
gpt4 key购买 nike

我想在换行符上分割一个字符串,我很惊讶我找不到 intercalate "\n" 的反函数.也就是说,一个将字符串拆分为新行(或根据其他谓词)的函数。

请注意 lineswords做一些不同的事情。例如

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

但我想知道 如果仅使用 base 中的函数可以更轻松地构建它.

最佳答案

正如 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com