Haskell - это чрезвычайно высокоуровневый язык, и вы задаете вопрос о чрезвычайно низкой детализации.
В целом, производительность Haskell, вероятно, похожа на любой собранный мусором язык, такой как Java или C#. В частности, Haskell имеет изменяемые массивы, которые будут иметь производительность, аналогичную любому другому массиву. (Вам могут понадобиться распакованные массивы, чтобы соответствовать производительности C.)
Для чего-то вроде складки, если конечный результат - что-то вроде целого числа машины, вероятно, заканчивается в регистре процессора на весь период цикла. Таким образом, окончательный машинный код в значительной степени идентичен “ переменной с непрерывным доступом в C ”. (Если результатом является словарь или что-то еще, то, вероятно, нет. Но это то же самое, что и C.)
В целом, если местность - это то, что имеет для вас значение, любой собранный мусором язык, вероятно, не является вашим друг. Но, опять же, вы можете использовать распакованные массивы, чтобы обойти это.
Все этого переговоры велик, и все, но если вы действительно хотите знать, как быстро конкретная программа Haskell является, теста он. Оказывается, хорошо написанные программы Haskell обычно бывают довольно быстрыми. (Как и большинство скомпилированных языков.)
Добавлено: вы можете попросить GHC вывести частично скомпилированный код в формате Core, который является более низким, чем Haskell, но более высоким, чем машинный код. Это позволяет видеть, что решил компилятор (в частности, когда материал был встроен, где были удалены абстракции и т. Д.). Это может помочь вам узнать, как выглядит окончательный код, без необходимости запускать все путь до машинного кода.
Конечно, Haskell не указывает это - так что это будет зависеть от реализации (скорее всего, GHC), и я думаю, что это будет * smart * достаточно, чтобы скомпилировать что-то вроде 'foldl' в цикл (если не сам GHC, бэкэнд справится), но я действительно просто угадываю - * конечно * вы всегда можете попробовать это для себя и посмотреть на выход;) – Carsten
Читает все еще пользу от локальности. Мутируемые массивы в подходящих монадах должны иметь эквивалентную производительность, как на императивных языках. Неизменяемые структуры данных, конечно, не позволяют простоту модификации на месте. В некоторых случаях GHC может оптимизировать это (например, жесткие числовые циклы не выделяют новые целые числа на каждой итерации). OTOH, имеющий неизменность, очень помогает в распараллеливании кода без частых аннулирования кеша. – chi