4

Например я пишу (\x y -> x) (\x -> x) 12 и чтоб распечатал буквально (\x->x) (и не тип T->T (пробовал через :t)) Чтоб не писал "No instance for (Show..." и чтоб распечатывал любую анонимную функцию, независимо от сигнатуры. То есть, чтобы можно было использовать Haskell как интерпретатор чистого лямбда-исчисления (но с синтаксисом Haskell)

asianirish
  • 2,864
  • нашел в сети интерпретатор чистого -исчисления, но он крайне неудобен, всюду требует явно указывать скобки для группировки (даже где они подразумеваются по умолчанию), получается какой-то кошмар из скобок. Вот, попробуйте сами: https://www.eecs.berkeley.edu/~gongliang13/lambda/#firstPage – asianirish Apr 08 '15 at 17:39

1 Answers1

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
  • Спасибо, исправил – asianirish Jun 04 '15 at 17:42
  • Может быть можно не через шаблоны, а как-нибудь через типы? – asianirish Jun 06 '15 at 19:31
  • Чтобы получить выражение, вычисляющее функцию, нужно иметь доступ к формальной структуре, описывающей процесс вычисления: исходным кодам, дереву синтаксического разбора. Библиотеки Template Haskell, насколько я знаю, имеют доступ к дереву синтаксического разбора обычного Haskell-кода. Т.е. возможна библиотека, содержащая функцию extractFunctionExpession :: t -> String такую, что выражение extractFunctionExpression (\x -> x) вернёт строку похожую на "\x -> x" – Alexander Razorenov Jun 07 '15 at 08:13