Найти выводимый тип для локальной функции - программирование
Подтвердить что ты не робот

Найти выводимый тип для локальной функции

Есть ли способ в ghci (или ghc), чтобы найти, что подразумевается тип локальной функции?

например. если у меня есть функция

f l = map f' l
   where f' = (+1)

существует ли в ghci :t -подобный способ, чтобы узнать, какой тип вывода для f' равен?

4b9b3361

Ответ 1

Я не знаю, как это сделать из GHCi.

Однако, если вы используете редактор, такой как Emacs или Vim, вы можете попробовать ghc-mod. Это внешний инструмент, который подключается к редактору и предоставляет некоторые функциональные возможности IDE для программ Haskell, включая возможность получения типа произвольного выражения, включая локальное определение.

В Emacs вы должны использовать C-c C-t, чтобы найти тип выражения.

Если вы не используете Emacs или Vim, вы, вероятно, можете обернуть ghc-mod как расширение GHCi или что-то еще, но я думаю, что это будет несколько неудобно. Я не могу представить себе хороший способ сделать это, не имея редакторский интерфейс. Однако сам ghc-mod - это просто автономный инструмент командной строки, поэтому его легко работать. Если вы можете подумать о хорошем пользовательском интерфейсе для него, который не зависит от существующего текстового редактора, ищите его!

Конечно, если вы не используете Emacs или Vim, вы, вероятно, должны: P.

Ответ 2

В самом деле, есть, что я узнал из-за благодарности hammar awesome здесь. Здесь короткая версия:

Prelude> :l /tmp/foo.hs
[1 of 1] Compiling Main             ( /tmp/foo.hs, interpreted )
Ok, modules loaded: Main.
*Main> :break f
Breakpoint 0 activated at /tmp/foo.hs:(1,1)-(2,18)
*Main> f [1..10]
Stopped at /tmp/foo.hs:(1,1)-(2,18)
_result :: [b] = _
[/tmp/foo.hs:(1,1)-(2,18)] *Main> :step
Stopped at /tmp/foo.hs:1:7-14
_result :: [b] = _
f' :: b -> b = _
l :: [b] = _
[/tmp/foo.hs:1:7-14] *Main> :t f'
f' :: b -> b

Ответ 3

Попробуйте hdevtools, он довольно быстрый и простой в использовании, хотя есть только интеграция для Vim.