在许多语言中,都有一个函数使用指定的分隔符将字符串分成多个部分。通常称为split
。您可以在Python,C#,Java,JavaScript中找到它。但是Haskell虽然相当成熟,但在标准库中仍然缺少这种功能。我知道有一个名为split
的库正好提供此功能。但这与在标准库中具有此功能不同。
因此,尽管此功能非常方便和有用,以至于许多其他语言将其添加到其标准库中,但这实际上是为什么Haskell没有它的原因。 没有它背后的论据是什么?
UPD:问题是关于base
软件包,即前奏。换句话说,为什么它有words
和lines
但没有split
?
答案 0 :(得分:7)
几个Haskell模块实现了拆分功能,实际上,它甚至具有几个变体,这些变体比Python,C#,Java等中的变体更通用。
split
package [Hackage]有几个Convenience functions可以切开a
s的缝隙:
splitOn :: Eq a => [a] -> [a] -> [[a]]
splitOneOf :: Eq a => [a] -> [a] -> [[a]]
splitWhen :: (a -> Bool) -> [a] -> [[a]]
例如:
Prelude Data.List.Split> splitOneOf ",&" "foo,bar&qux"
["foo","bar","qux"]
如果要执行高性能的文本处理,通常会在String
上使用Text
,因为它们以更紧凑的方式存储。 text
package [Hackage]具有功能splitOn :: Text -> Text -> [Text]
,用于在Text
列表中拆分文本。此外,您可以使用split :: (Char -> Bool) -> Text -> [Text]
根据字符的条件进行拆分。例如:
Prelude Data.Text> :set -XOverloadedStrings
Prelude Data.Text> splitOn ", " "foo,bar, qux, bla, , true"
["foo,bar","qux","bla","","true"]
Prelude Data.Text> import Data.Char
Prelude Data.Text Data.Char> split isDigit "foo1bar22true"
["foo","bar","","true"]
关于标准库
的注释 Haskell标准库应支持的绝对最小值在Part II: The Haskell 2010 Libraries of the Haskell'10 report中定义。 Data.List
上的操作数量非常有限。
然后有GHC的Data.List
库,但是根据@ØrjanJohansen,这主要是Haskell报告中功能的超集,其中GHC需要本身
haskell platform旨在分发一组标准软件包。 split
和<Data.Text
一样,是完整平台库的一部分。
答案 1 :(得分:5)
简而言之,这就是生态系统的滚动方式。
如果我们直接使用“标准库”并仔细查看the Haskell report指定的模块,我们会发现Haskell的标准库非常小-甚至不是全部 base 已经包括了。我们可能会在一定程度上扩大我们的范围,并将the libraries bundled with GHC视为事实上的标准。第二组包括一些绝对基础的内容,例如 base , bytestring , text ,容器, transformers 和 mtl 。
无论如何,更广泛的观点是,一组受祝福的核心库的概念在Haskell实践中的作用不像在其他某些语言中那样重要。图书馆完全有可能在生态系统中发挥重要作用而不会被视为某种标准。 split 库mentioned by Willem及其555 reverse dependencies in Hackage可以满足要求。