我刚刚阅读了《Real World Haskell》的第14章,昨天对此有些疑问。
在Logger单子例子中,bind函数实现如下:
-- (>>=) :: Logger a -> (a -> Logger b) -> Logger b
m >>= k = let (a, w) = execLogger m
n = k a
(b, x) = execLogger n
in Logger (b, w ++ x)
在注射器函数中,第二个元素包含我们的日志消息,使用++不断追加。(阅读此处以获取更多上下文信息。)
我的问题是...这样做会使得使用Logger时运行时复杂度与消息数量成二次关系吗?
如果我错了,请帮忙提供正确的分析和大O符号。
如果我是对的,我希望有更多经验/见解的Haskell和该书作者能告诉我为什么选择这种实现方式,并且为什么可以接受。 在该书的前一章中,有一节说这种列表追加方式很糟糕,并教我们区别列表技术。为什么这里没有使用它?
顺便说一句,我喜欢这本书,它将是我长期以来阅读的一本书。