В названном Python существует функция eval
это берет строковый вход и оценивает его.
>>> x = 1
>>> print eval('x+1')
2
>>> print eval('12 + 32')
44
>>>
Из чего Haskell эквивалентен eval
функция?
В языке нет встроенного eval, хотя Template Haskell позволяет оценивать время компиляции.
Для eval во время выполнения - то есть для метапрограммирования во время выполнения - в Hackage есть несколько пакетов, которые по сути импортируют GHC или GHCi, включая старый пакет hs-plugins и пакет подсказок.
Не существует эквивалента eval, Haskell - это статически компилируемый язык, такой же, как C или C ++ который также не имеет eval.
Он не имеет встроенной функции eval. Однако есть несколько пакетов на взломе , которые могут делать то же самое . ( документы ). Благодаря @luqui есть также подсказка .
Это правда, что в Haskell, как в Java, C ++ или подобных языках, вы можете вызывать компилятор, затем динамически загружать код и выполнять его. Однако, как правило, это тяжело, и почти никогда люди не используют eval ()
на других языках.
Люди склонны использовать eval ()
в языке, потому что, учитывая возможности этого языка, для определенных классов задач легче построить строку из входных данных программы, которая напоминает сам язык, чем анализировать и оценивать ввод напрямую.
Например, если вы хотите разрешить пользователям вводить в поле ввода не только числа, но и простые арифметические выражения, в Perl или Python будет намного проще просто вызвать eval ()
на входе, чем писать синтаксический анализатор для языка выражений, который вы хотите разрешить. К сожалению, такой подход почти всегда приводит к плохому взаимодействию с пользователем (сообщения об ошибках компилятора не предназначены для непрограммистов) и открывает дыры в безопасности. Решение этих проблем без использования eval ()
обычно требует значительного количества кода.
В Haskell, благодаря таким вещам, как Parsec , на самом деле очень легко написать синтаксический анализатор и вычислитель для такого рода проблем ввода, и это значительно устраняет тоску по eval
.