Haskell 通过++;或<&燃气轮机;

Haskell 通过++;或<&燃气轮机;,haskell,Haskell,我想知道是否有理由在字符串连接中使用一个而不是另一个: λ> "foo" ++ "bar" "foobar" λ> "foo" <> "bar" "foobar" 是否有任何赞成/反对意见可以使用其中一种?通常我更喜欢,因为这意味着我可以更容易地在类型字符串和文本之间切换。还有其他的优点/缺点吗?我同意,更可取,因为它适用于Prelude.String以外的文本类型 我能想到的唯一缺点是:更多的多态性也可能意味着类型变得模棱两可。具体地说,当-XOverloadedSt

我想知道是否有理由在字符串连接中使用一个而不是另一个:

λ> "foo" ++ "bar"
"foobar"
λ> "foo" <> "bar"
"foobar"
是否有任何赞成/反对意见可以使用其中一种?通常我更喜欢
,因为这意味着我可以更容易地在类型
字符串
文本
之间切换。还有其他的优点/缺点吗?

我同意,
更可取,因为它适用于
Prelude.String
以外的文本类型


我能想到的唯一缺点是:更多的多态性也可能意味着类型变得模棱两可。具体地说,当
-XOverloadedStrings
处于活动状态时,您不能再将字符串文本传递给输入多态函数。有时候,仅仅一点点额外的信息就可以帮助解决这些含糊不清的问题。当使用
++
时,编译器知道它必须是一个列表表示,然后
IsString[a]
实例中的
a~Char
约束足以推断您希望它是一个普通的旧
字符串。但是当您使用
时,很可能其中一个操作数已经约束了类型,而且在不明确的情况下是否最好始终添加显式签名也是有争议的,我不会依赖于像
++

这样的细微细节,除非我真的因为某种原因而
mappend
++
上使用
是一个非常重载的运算符。例如,
(drop-take)2
字符串旋转两个位置,在这种情况下,
用作
+
(在
(a->b)
的半组实例下),这是有目的的。否则我会一直坚持
++
,否则很容易引起混淆。@Redu我不明白你的意思,但你为什么不详细说明一下作为另一个答案呢?-
>=
也是一个非常重载的操作符(扩展到
do
),但是没有人会想到使用任何其他东西来排序
IO
操作。@LeftAroundaound绝对
(>>=)
对于
IO
更可取,但我知道我更喜欢使用
concatMap
(>=)
当它使代码更具可读性,并且我所做的事情没有本质上的一元性时。可能Redu的意思是类似的-
()
可以,但是在连接
字符串时使用
(++)
,因为它更清晰,上下文更少。(当然我不是Redu,所以我无法知道这个推测是否正确。)@leftaroundabout Yes@bradm正确阅读了我的评论,我说的是
是某种抽象(半群和幺半群)下的串联。我评论中的例子说明了这一点<代码>
只有在我们将
应用于具有列表/字符串类型返回值的两个函数并很好地链接起来之后,才会漂亮地成为
++
>=
也是某种抽象的一部分,用于将一元操作/解析链接起来。我确信在正常情况下,您更喜欢使用
concat
而不是
>=id
,对吧?@Redu不,我更喜欢使用。(或)
instance Semigroup [a] where
        (<>) = (++)