Во-первых, не декларированный, а декларативный. Во-вторых, Haskell — не декларативный, а функциональный язык.
В чисто функциональном языке для обычной разработки особого смысла нет, поэтому в Haskell есть средства работы с состояниями. Какой смысл изучать? Хотя бы для того, чтобы писать в несколько раз меньше кода.
Некоторые вещи удобно выразить с помощью одного способа, а некоторые — с помощью другого. Самый банальный пример: рекурсивные алгоритмы можно выразить без рекурсии (иногда просто через циклы, иногда надо писать свой стек), но при этом можно потерять красивость и понятность кода. Решение любых динамических задач можно выразить через ручной императивный алгоритм, через рекурсию с кешем или через определение переходов между состояниями (не видел такого. но как идея интересна; редактирование: хотя, возможно стоит глянуть на пролог). Точно так же с функциональщиной и императивщиной. Смешивая парадигмы мы можем получить оптимальный код с точки зрения удобности, понятности и скорости.
Думаю, люди, которые высказываются подобно тредстартеру, имеют в виду не мультипарадигменность, а именно костыли (попытки писать в парадигме, явно языком не поддерживающейся). Другое дело, что линзы в Haskell, как они здесь описаны, совсем на костыли не похожи.
Думаю, что несмотря на название «программируем императивно», линзы ближе к «программируем объектно-ориентированно».
Но, линзы — это всё же не объекты, поэтому говорить о костылях в данном случае неуместно.
В основном человек принимает новое только через что-то знакомое. Поэтому дана попытка показать совершенно новый инструментарий (ранее неизвестный) при помощи аналогий.
Программируем императивно в Хаскеле, используя линзы