Generic Haskell' stringy'函数,或:行在哪里:: IsString a => a - >并[a]?

时间:2018-01-04 18:52:51

标签: string haskell text

我在unlines中搜索Data.String.Combinators函数的反函数,unlines通过追加换行来加入行:

unlines :: (Monoid s, IsString s) => [s] -> s

unlines的倒数应为lines,它会在换行符上拆分类似字符串的对象:

lines :: IsString s => s -> [s]

hooglehayoo的广泛搜索,以及splitsplitOn等的变体都不会返回任何内容。函数unlines的命名甚至暗示其反lines的存在。所有Data.StringData.TextData.ByteString等都有lines函数,但似乎不存在通用实现。

奇怪的是,这样的功能不应该存在,这让我觉得奇怪。这有什么根本原因吗?

背景:由于String仍然被广泛使用,即使每个人(?)都知道它几乎不应该在所有情况下,我认为这样做会很好用String->StringIsString s => s -> s替换我自己的(IsString s, Monoid s) => s -> s和类似函数。这样至少我不会对String产生偏见,同时仍允许String易于使用。

更新

现在我很清楚,只提供IsString的{​​{1}}类型类对于这样的fromString函数来说还不够。因此,问题变成:需要什么属性以及类型类型(如果有的话)包含'它们?

1 个答案:

答案 0 :(得分:5)

IsString a仅提供从Stringa的转化。这使得编写有意义的lines一般不可行。

例如,这是一个微不足道的案例。

data T = T

instance IsString T where
   fromString _ = T
instance Monoid T where
   mempty = T
   mappend _ _ = T

我们无法真正定义lines :: T -> [T]:该函数唯一可能的(非底部)结果是[T,T,T,...,T]形式的列表,它几乎没用,因为它与输入完全无关fromString

如果可能,我建议使用更丰富的类型类来允许lines函数。