haskell - Haskell 中修改了 `break`?

标签 haskell

break 具有签名 [a] -> (a -> Bool) -> ([a], [a]) 其中第一个元组等于,正如我理解,takeWhile 谓词为 true。第二个元组是负责使谓词为假的项目加上剩余的列表。

> break (== ' ') "hey there bro"
("hey"," there bro")

但是,是否有一个函数可以跳过导致损坏的项目?

>foo? (== ' ') "hey there bro"
("hey","there bro")

最佳答案

不在标准库中,但您可以方便地drop 1在元组的第二个元素上使用 Functor配对实例:

break (== ' ') "hey there bro"
== ("hey"," there bro")

drop 1 <$> break (== ' ') "hey there bro"
== ("hey","there bro")

<$>fmap 的中缀同义词。使用drop 1而不是tail处理空后缀的情况:

drop 1 <$> break (== ' ') "hey"
== ("hey","")

tail <$> break (== ' ') "hey"
== ("hey","*** Exception: Prelude.tail: empty list

不过,在使用元组时,我通常更喜欢使用 second来自Control.Arrow超过fmap ,因为它更好地传达了意图:

second (drop 1) $ break (== ' ') "hey there bro"
== ("hey","there bro")

关于haskell - Haskell 中修改了 `break`?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23643897/

相关文章:

haskell - 使用 postgresql-simple 创建数据库连接时的 GHCI Segfault

Haskell:可以递归调用 main 吗?

Haskell 文档测试和 FFI

haskell - 大型 Monad 堆栈的示例

parsing - Happy 运算符优先级错误

arrays - Haskell 中的固定大小列表(即具有类似列表 API 的数组)

haskell - 如何在 Haskell 中使用没有 else 条件的 if-then-else 语句?

haskell - 重载 Haskell 函数以具有不同数量的参数

haskell - 让模板haskell用源信息(例如行号)包装函数的正确方法是什么

haskell - 将 StateT 与 InputT 结合