Определите тип строки, содержащей выражение Haskell

Мне нужен (быстрый и грязный) способ получить некоторое представление типа выражения Haskell, которое задается в виде строки.

На данный момент я вижу 3 варианта:

  • Используйте GHC API — однако документация довольно быстро меня утомляет.
  • Используйте какой-нибудь другой инструмент для вывода типов — мне предложили попробовать haskell-type-exts, но он не может ввести все выражения, кроме самых тривиальных. Я не знаю другого такого инструмента.
  • Сверните мой собственный вывод HM - я бы избегал этого, если в этом нет крайней необходимости

Мне даже не нужно полное решение, в том смысле, что мне вполне достаточно библиотеки/инструмента, который может набирать разумное базовое подмножество Haskell.

Итак, каков самый простой способ добиться этого?


person xcvii    schedule 04.05.2013    source источник
comment
Взгляните на другие реализации Haskell — некоторые из них могут быть проще в использовании, чем GHC.   -  person Petr    schedule 04.05.2013
comment
Если вы решите написать свой собственный, THIH Марка П. Джонса может оказаться полезным. хорошее начало.   -  person Daniel Fischer    schedule 04.05.2013


Ответы (1)


Пакет hint предлагает несколько ограниченный, но, возможно, более понятный интерфейс API GHC. Может быть, этого достаточно для ваших целей? Если нет, вы можете посмотреть исходники, чтобы лучше понять, как напрямую использовать GHC API.

Вот пример программы:

import Language.Haskell.Interpreter

main :: IO ()
main = do
  r <- runInterpreter $ do
    setImports ["Prelude"]
    typeOf "map (+1)"
  either print putStrLn r

Если запустить, это печатает

Num b => [b] -> [b]
person kosmikus    schedule 04.05.2013