我在unlines
中搜索Data.String.Combinators
函数的反函数,unlines
通过追加换行来加入行:
unlines :: (Monoid s, IsString s) => [s] -> s
unlines
的倒数应为lines
,它会在换行符上拆分类似字符串的对象:
lines :: IsString s => s -> [s]
对hoogle和hayoo的广泛搜索,以及split
,splitOn
等的变体都不会返回任何内容。函数unlines
的命名甚至暗示其反lines
的存在。所有Data.String
,Data.Text
,Data.ByteString
等都有lines
函数,但似乎不存在通用实现。
奇怪的是,这样的功能不应该存在,这让我觉得奇怪。这有什么根本原因吗?
背景:由于String
仍然被广泛使用,即使每个人(?)都知道它几乎不应该在所有情况下,我认为这样做会很好用String->String
或IsString s => s -> s
替换我自己的(IsString s, Monoid s) => s -> s
和类似函数。这样至少我不会对String
产生偏见,同时仍允许String
易于使用。
现在我很清楚,只提供IsString
的{{1}}类型类对于这样的fromString
函数来说还不够。因此,问题变成:需要什么属性以及类型类型(如果有的话)包含'它们?
答案 0 :(得分:5)
IsString a
仅提供从String
到a
的转化。这使得编写有意义的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
函数。