gpt4 book ai didi

haskell - 不能将 ""和 unwords 穿插用作彼此的替代品吗?

转载 作者:行者123 更新时间:2023-12-04 06:14:47 26 4
gpt4 key购买 nike

我试图重写:

return $ renderHtml $ mconcat $ intersperse " " $ catMaybes links

哪个工作得很好,进入:
return $ renderHtml $ mconcat $ unwords $ catMaybes links

但它正在返回:
Couldn't match type ‘Char’
with ‘blaze-markup-0.7.0.2:Text.Blaze.Internal.MarkupM ()’
Expected type: H.Html
Actual type: Char
In the second argument of ‘($)’, namely
‘mconcat $ unwords $ catMaybes links’
In the second argument of ‘($)’, namely
‘renderHtml $ mconcat $ unwords $ catMaybes links’
In a stmt of a 'do' block:
return $ renderHtml $ mconcat $ unwords $ catMaybes links

我还不是最擅长使用 Haskell,但我认为 intersperse " "unwords 只是相互替换?

编辑 :最终,我想找出一种使用 unwords 的方法......找出为什么它给我错误以及我如何解决它是目标! =)

最佳答案

unwords :: [String] -> String 函数仅适用于 String 列表。您拥有的是 MarkupM () 类型的值列表。
intersperse :: a -> [a] -> [a] 工作的原因是它适用于任何类型的列表。使用 OverloadedStrings pragma " " 值的类型为 MarkupM (因为该类型具有 IsString 的实例)。 intersperse 函数获取这些标记值的列表并在它们之间放置空格,但仍返回标记值列表。最后 mconcat 将列表连接成一个仍然是 MarkupM () 类型的值。使用一些伪数据构造函数,您可以想象这样的值:

[Markup "foo", Markup "bar", Markup "baz"] -- returned by catMaybes links
[Markup "foo", Markup " ", Markup "bar", Markup " ", Markup "baz"] -- after intersperse
Markup "foo bar baz" -- after mconcat

在这种情况下没有简单的方法让 unwords 工作,因为你没有字符串,转换为字符串会失去一些好处。例如,将标记封装在适当的包装器中可确保您不会生成格式不正确的 HTML。

关于haskell - 不能将 ""和 unwords 穿插用作彼此的替代品吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31498651/

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