Любой способ распечатать тип переменной в блоке do / while / let? - PullRequest
15 голосов
/ 20 июля 2011

Есть ли способ вывести выводимый тип вложенной переменной в ghci? Рассмотрим код,

let f = g where
    g (x :: Int) = x

тогда было бы неплохо запросить тип g, например :t f.g распечатает Int -> Int.

Ответы [ 2 ]

10 голосов
/ 20 июля 2011
Отладчик

ghci может распечатать его для вас с правильно установленной точкой останова (но вам нужно загрузить определение в модуле):

{-# LANGUAGE ScopedTypeVariables #-} 

f a = g a where
    g (x :: Int) = x

Затем в ghci:

Prelude> :l tmp2.hs
[1 of 1] Compiling Main             ( tmp2.hs, interpreted )
Ok, modules loaded: Main.
*Main> :b 3 9
Breakpoint 0 activated at tmp2.hs:3:7-9
*Main> f undefined
Stopped at tmp2.hs:3:7-9
_result :: Int = _
a :: Int = _
g :: Int -> Int = _
[tmp2.hs:3:7-9] *Main>
9 голосов
/ 20 июля 2011

Вы можете получить эту информацию, указав неправильную аннотацию типа и проверив сообщение об ошибке.

*Main> let f = g where g::a; g (x::Int) = x

<interactive>:1:23:
    Couldn't match type `a1' with `Int -> Int'
      `a1' is a rigid type variable bound by...
...