在许多语言中,都有一个函数使用指定的分隔符将字符串分成多个部分。通常称为split。您可以在Python,C#,Java,JavaScript中找到它。但是Haskell虽然相当成熟,但在标准库中仍然缺少这种功能。我知道有一个库叫做split提供此功能。但这与在标准库中具有此功能不同。
因此,尽管此功能非常方便实用,以至于许多其他语言将其添加到标准库中,但这实际上是为什么Haskell没有它的原因。没有它背后的论据是什么?
UPD:问题在于base软件包,即Prelude。换句话说,为什么有words和lines没有split?
多个Haskell模块实现了split函数,实际上,它甚至具有多个变体,这些变体比Python,C#,Java等中的变体更为通用。
所述split包[Hackage] ,有几个便利函数分割的狭缝aS:
splitOn :: Eq a => [a] -> [a] -> [[a]]
splitOneOf :: Eq a => [a] -> [a] -> [[a]]
splitWhen :: (a -> Bool) -> [a] -> [[a]]Run Code Online (Sandbox Code Playgroud)
例如:
Prelude Data.List.Split> splitOneOf ",&" "foo,bar&qux"
["foo","bar","qux"]
Run Code Online (Sandbox Code Playgroud)
如果要执行高性能文本处理,通常会使用Textover Strings,因为它们以更紧凑的方式存储。所述text包[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"]
Run Code Online (Sandbox Code Playgroud)
关于标准库的注释
Haskell标准库应支持的绝对最低限度在第二部分:Haskell'10报告的Haskell 2010库中定义。进行的操作数量Data.List非常有限。
然后是Data.ListGHC库,但是根据@ØrjanJohansen的说法,这主要是Haskell报告中功能的超集,其中GHC需要自身的功能。
该哈斯克尔平台旨在分发一套标准软件包。split是的库的一部分全平台原样Data.Text。
简而言之,这就是生态系统滚动的方式。
如果我们从字面上理解“标准库”,并仔细查看Haskell报告指定的模块,我们会发现Haskell的标准库非常小-甚至没有包括所有基本库。我们可能会适当扩大我们的范围,并将与GHC捆绑在一起的库视为事实上的标准。这第二组包括一些绝对重要的东西,比如其余基地,字节串,文本,容器,变压器和MTL。
无论如何,更广泛的观点是,一组受祝福的核心库的概念在Haskell实践中的作用不像在其他某些语言中那样重要。图书馆完全有可能在生态系统中发挥重要作用而不会被视为某种标准。Willem提到的split库在Hackage中具有555个反向依赖关系,可以说是合算的。