А самый сильный момент в ФП, это разделение ответственности - чистый код отдельно, грязный отдельно. При этом "грязный код" должен входить в систему типов, т.е. эффекты должны быть выразимы в языке
В языках с контролем эффектов эти самые эффекты - first class citizens (это в эльме есть, т.к. таски можно вернуть из функции), но самое главное - можно описывать свои эффекты (этого в эльме нет и не будет)
Поэтому эльм, это фреймворк аля ангуляр - он построен по принципу "не вы вызываете и управляете потоком исполнения, но ядро вызывает вас" - инверсия контроля в чистом виде.
Но эта же инверсия контроля мешает строить по-настоящему сложные вещи - всё превращается в task hell. Не так быстро, как JS скатывается в callback hell, но столь же неминуемо (task hell не касается только совсем простых приложений на базе beginnerProgram, ибо "нет тасок - нет проблем")
- генерация случайных чисел (в эльме есть, но убогая) - контролируемая мутабельность (state) - передача окружения (чтобы не тащить через десять слоёв вызовов функций аргумент для одинадцатого слоя) - логирование (не в console, а в произвольные структуры данных)
- генерация случайных чисел (в эльме есть, но убогая) - контролируемая мутабельность (state) - передача окружения (чтобы не тащить через десять слоёв вызовов функций аргумент для одинадцатого слоя) - логирование (не в console, а в произвольные структуры данных)
и это только простые "сермяжные" эффекты, применяемые на практичке довольно часто. А есть и менее очевидные
Эльм намеренно не язык "на все руки мастер", чем и хорош. Из действительно необходимых вещей вижу только генерацию случайных чисел и она вроде норм. Или вот в графике текстуры грузить, но это тоже норм сделано, например, в elm-webgl.