Эквивалентный из оценки Python в Haskell

В названном Python существует функция eval это берет строковый вход и оценивает его.

>>> x = 1
>>> print eval('x+1')
2
>>> print eval('12 + 32')
44
>>>  

Из чего Haskell эквивалентен eval функция?

9
задан Don Stewart 18 April 2011 в 22:58
поделиться

5 ответов

В языке нет встроенного eval, хотя Template Haskell позволяет оценивать время компиляции.

Для eval во время выполнения - то есть для метапрограммирования во время выполнения - в Hackage есть несколько пакетов, которые по сути импортируют GHC или GHCi, включая старый пакет hs-plugins и пакет подсказок.

10
ответ дан 4 December 2019 в 06:01
поделиться

Не существует эквивалента eval, Haskell - это статически компилируемый язык, такой же, как C или C ++ который также не имеет eval.

1
ответ дан 4 December 2019 в 06:01
поделиться
3
ответ дан 4 December 2019 в 06:01
поделиться

Он не имеет встроенной функции eval. Однако есть несколько пакетов на взломе , которые могут делать то же самое . ( документы ). Благодаря @luqui есть также подсказка .

12
ответ дан 4 December 2019 в 06:01
поделиться

Это правда, что в Haskell, как в Java, C ++ или подобных языках, вы можете вызывать компилятор, затем динамически загружать код и выполнять его. Однако, как правило, это тяжело, и почти никогда люди не используют eval () на других языках.

Люди склонны использовать eval () в языке, потому что, учитывая возможности этого языка, для определенных классов задач легче построить строку из входных данных программы, которая напоминает сам язык, чем анализировать и оценивать ввод напрямую.

Например, если вы хотите разрешить пользователям вводить в поле ввода не только числа, но и простые арифметические выражения, в Perl или Python будет намного проще просто вызвать eval () на входе, чем писать синтаксический анализатор для языка выражений, который вы хотите разрешить. К сожалению, такой подход почти всегда приводит к плохому взаимодействию с пользователем (сообщения об ошибках компилятора не предназначены для непрограммистов) и открывает дыры в безопасности. Решение этих проблем без использования eval () обычно требует значительного количества кода.

В Haskell, благодаря таким вещам, как Parsec , на самом деле очень легко написать синтаксический анализатор и вычислитель для такого рода проблем ввода, и это значительно устраняет тоску по eval .

25
ответ дан 4 December 2019 в 06:01
поделиться
Другие вопросы по тегам:

Похожие вопросы: