gpt4 book ai didi

string - 通用 Haskell 'stringy' 函数,或者:lines::IsString a => a -> [a] 在哪里?

转载 作者:行者123 更新时间:2023-12-02 06:22:30 25 4
gpt4 key购买 nike

我正在 Data.String.Combinators 中搜索 unlines 函数的逆函数,unlines 通过附加换行符来连接行:

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

unlines 的逆应该是 lines,它在换行符上分割一个字符串对象:

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

hoogle进行广泛搜索和 hayoo ,还有 splitsplitOn 等的变体,什么也不返回。函数 unlines 的命名甚至暗示了其逆 lines 的存在。所有 Data.StringData.TextData.ByteString 等都有一个 lines 函数,但没有泛型实现似乎存在。

令我感到奇怪的是,这样的函数不应该存在。这有什么根本原因吗?

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

更新

现在我很清楚,仅提供 fromStringIsString 类型类对于这样的 lines 函数来说是不够的。所以问题变成了:需要哪些属性以及什么类型类(如果有的话)“封装”它们?

最佳答案

IsString a 仅提供从 Stringa 的转换。一般来说,这使得编写有意义的变得不可行。

例如,这是一个简单的案例。

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 函数。

关于string - 通用 Haskell 'stringy' 函数,或者:lines::IsString a => a -> [a] 在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48101740/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com