Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
通用Haskell';stringy';函数,或:其中是lines::IsString a=>;a->;[a] ??_String_Haskell_Text - Fatal编程技术网

通用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
(常见,取决于代码库),然后用户的文本都需要类型注释