通用Haskell'stringy'函数,Or:哪里是lines :: IsString a => a - > [a]?

mcm*_*yer 2 string text haskell

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

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

unlines应该是倒数lines,它在换行符上拆分一个类似字符串的对象:

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

在广泛的搜索hooglehayoo,也变化split,splitOn等返回任何内容.函数的命名unlines甚至暗示了它的逆的存在lines.所有Data.String,Data.Text,Data.ByteString等有lines作用,但没有通用的实现似乎存在.

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

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

更新

现在,我很清楚IsString,仅提供类型的类型fromString对于这样的lines功能是不够的.所以问题变成:需要什么属性以及什么类型类型,如果有的话,"封装"它们?

chi*_*chi 5

IsString a只有从提供了一个转换Stringa.lines一般来说,这使得写一个有意义的不可行.

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

data T = T

instance IsString T where
   fromString _ = T
instance Monoid T where
   mempty = T
   mappend _ _ = T
Run Code Online (Sandbox Code Playgroud)

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

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