为什么Haskell没有拆分功能?

Nol*_*lan 2 haskell package

在许多语言中,都有一个函数使用指定的分隔符将字符串分成多个部分。通常称为split。您可以在Python,C#,Java,JavaScript中找到它。但是Haskell虽然相当成熟,但在标准库中仍然缺少这种功能。我知道有一个库叫做split提供此功能。但这与在标准库中具有此功能不同。

因此,尽管此功能非常方便实用,以至于许多其他语言将其添加到标准库中,但这实际上是为什么Haskell没有它的原因。没有它背后的论据是什么?

UPD:问题在于base软件包,即Prelude。换句话说,为什么有wordslines没有split

Wil*_*sem 7

多个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

  • 这实际上并没有解决问题,这是关于在标准库(即“ base”)中没有拆分功能的原因。 (3认同)

dup*_*ode 6

简而言之,这就是生态系统滚动的方式。

如果我们从字面上理解“标准库”,并仔细查看Haskell报告指定的模块,我们会发现Haskell的标准库非常小-甚至没有包括所有基本库。我们可能会适当扩大我们的范围,并将与GHC捆绑在一起的库视为事实上的标准。这第二组包括一些绝对重要的东西,比如其余基地字节串文本容器变压器MTL

无论如何,更广泛的观点是,一组受祝福的核心库的概念在Haskell实践中的作用不像在其他某些语言中那样重要。图书馆完全有可能在生态系统中发挥重要作用而不会被视为某种标准。Willem提到split在Hackage中具有555个反向依赖关系,可以说是合算的。

  • 我相信@chepner可能指的是“没有实际的问题需要解决”的事实,并且可能提示“您的问题只是变相的麻烦”,这两种提示都在帮助中心中列为您所质疑的类型应避免在此网站上询问。对于您的问题,最明显的正确答案是“没有很好的论据。”,如果这不令人满意,请考虑一下,以证明您的问题不适合SO。也许Reddit将是一个更好的论坛? (2认同)