Например я пишу (\x y -> x) (\x -> x) 12 и чтоб распечатал буквально (\x->x)
(и не тип T->T (пробовал через :t))
Чтоб не писал "No instance for (Show..." и чтоб распечатывал любую анонимную функцию, независимо от сигнатуры. То есть, чтобы можно было использовать Haskell как интерпретатор чистого лямбда-исчисления (но с синтаксисом Haskell)
Asked
Active
Viewed 199 times
4
asianirish
- 2,864
-
нашел в сети интерпретатор чистого -исчисления, но он крайне неудобен, всюду требует явно указывать скобки для группировки (даже где они подразумеваются по умолчанию), получается какой-то кошмар из скобок. Вот, попробуйте сами: https://www.eecs.berkeley.edu/~gongliang13/lambda/#firstPage – asianirish Apr 08 '15 at 17:39
1 Answers
1
Боюсь, что никак: в Haskell не предусмотрено средств для этого, как и в других компилируемых языках - тот же интерпретатор GHCi построен поверх компилятора и перед выполнением выражений выполняет их компиляцию - попробуйте набрать ghc --interactive ;-)
Это во-первых, во-вторых пример кода, приведённый Вами, не верен.
-
Нет ли каких-либо непрямых в каком-либо смысле "хитрых" способов? Непонятно где ошибка в приведенном примере кода? – asianirish Jun 03 '15 at 15:17
-
1Увы, нет - по-крайней мере в GHC - в результате компиляции (exe-файле или в машинных кодах в памяти) не хранится исходный код. Теоретически, можно решить подобную задачу с помощью расширения Template Haskell - оно поддерживается GHC - это средство позволяет автоматизировать генерацию кода и на этом уровне есть доступ к дереву синтаксического разбора кода, но я не знаю писал ли кто-то такую библиотеку :( Ошибка: приведённый код не работает в ghci:
parse error on input ``.'. Более правильный (с точки зрения Haskell) код(\x y -> x) (\x -> x) 12- он ведёт себя ровно так, как Вы описали. – Alexander Razorenov Jun 03 '15 at 15:56 -
-
-
Чтобы получить выражение, вычисляющее функцию, нужно иметь доступ к формальной структуре, описывающей процесс вычисления: исходным кодам, дереву синтаксического разбора. Библиотеки Template Haskell, насколько я знаю, имеют доступ к дереву синтаксического разбора обычного Haskell-кода. Т.е. возможна библиотека, содержащая функцию
extractFunctionExpession :: t -> Stringтакую, что выражениеextractFunctionExpression (\x -> x)вернёт строку похожую на"\x -> x"– Alexander Razorenov Jun 07 '15 at 08:13