Я только что добрался до Главы 14 из Реального Мира на Хаскелле и вчера задавался вопросом об этом.
В примере с монадой Logger функция связывания реализована следующим образом:
-- (>>=) :: 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)
где 2-й элемент в функции инжектора содержит наши сообщения журнала, которые постоянно добавляются с использованием ++. (Читайте онлайн около здесь для получения дополнительной информации.)
У меня вопрос: разве это не усложнит среду выполнения с использованием этого регистратора квадратичным по отношению к количеству сообщений?
Если я ошибаюсь, помогите, пожалуйста, предоставить правильный анализ и большую ой нотацию.
Если я прав, я надеюсь, что люди, которые имеют больше опыта / знаний о Haskell и книге, могут рассказать мне о некоторых причинах выбора этой реализации и почему это нормально.
В предыдущей главе книги есть раздел , в котором говорится, что этот способ добавления списка является плохим, и учит нас технике списков различий. Почему это не используется здесь?
Кстати, я люблю книгу, это будет книга, которую я прочитаю на обложке, чтобы покрыть ее долгое время.