通用Haskell';stringy';函数,或:其中是lines::IsString a=>;a->;[a] ??
我正在搜索通用Haskell';stringy';函数,或:其中是lines::IsString a=>;a->;[a] ??,string,haskell,text,String,Haskell,Text,我正在搜索Data.String.Combinators中unlines函数的逆函数,unlines通过添加换行来连接行: unlines::(幺半群s,IsString s)=>[s]>s unlines的倒数应该是lines,它在换行符上拆分一个stringlike对象: lines::IsString s=>s->[s] 对和的广泛搜索,以及split、splitOn等的变体,都不会返回任何结果。函数的命名为unlines甚至暗示其逆行的存在。所有数据.String,数据.Text,数据.
Data.String.Combinators
中unlines
函数的逆函数,unlines
通过添加换行来连接行:
unlines::(幺半群s,IsString s)=>[s]>s
unlines
的倒数应该是lines
,它在换行符上拆分一个stringlike对象:
lines::IsString s=>s->[s]
对和的广泛搜索,以及split
、splitOn
等的变体,都不会返回任何结果。函数的命名为unlines
甚至暗示其逆行的存在。所有数据.String
,数据.Text
,数据.ByteString
等都具有行
功能,但似乎不存在通用实现
我觉得奇怪的是这样一个函数竟然不存在。有什么根本原因吗?
背景:由于String
仍然被广泛使用,尽管每个人(?)都知道它不应该在几乎所有情况下都被使用,我认为最好用isstrings=>s
或(isstrings,monoids)=>s->s
替换我自己的String->String和类似的函数。这样至少我不会对String
产生偏见,同时仍然允许String
易于使用
更新
现在,我很清楚,IsString
typeclass只提供fromString
,对于这样的行
函数是不够的。因此,问题变成了:需要什么属性以及什么类型的类(如果有的话)“封装”了它们?IsString a
只提供了从String
到a
的转换。这使得编写有意义的行
通常是不可行的
例如,这里有一个小案例
data T = T
instance IsString T where
fromString _ = T
instance Monoid T where
mempty = T
mappend _ _ = T
我们无法真正定义行::t->[t]
:该函数唯一可能的(非底部)结果是[t,t,t,…,t]
格式的列表,它几乎没有用处,因为它与fromString
的输入完全无关
如果可能的话,我建议使用一个更丰富的类型类来支持行
函数。IsString
类不是用来表示“类似字符串的对象”—它的目的只是允许字符串文本重载。任何具有有限表示的类型(即使只是该类型的子集)都可以有一个合理的实例IsString
。在我看来,stringcombinators
的作者没有正确使用IsString
;绝对没有保证甚至没有约定IsString
和Monoid
一致(即fromString(a+b)=fromString a+fromString b
和fromString 0=0
)-如果没有这一事实,这些函数将不会有合理的行为。这个问题可能更适合使用背包式模块而不是typeclass来解决。您可能不希望这样做的一个原因是,如果启用了OverloadedString
(常见,取决于代码库),然后用户的文本都需要类型注释