2012-02-09 2 views

ответ

12

Другой способ (очень похож на RobAgar-х и Hacky, а) является явно указать, какой неправильный тип для локальной переменной в вопросе, например:

main = do 
    x <- getArgs 
    x ::() -- let's cast it to unit! ;) 
    print $ head x 

Тогда GHCi даст нам сообщение об ошибке:

Couldn't match expected type `()' with actual type `[String]' 

, который показывает, что фактическим типом «x» является [String].

+2

На самом деле, считая, что 'x' * не * имеет тот же монадический тип, что и блок do, вам даже не нужно отбрасывать его на единицу. Просто поместите 'x' в отдельной строке блока сделать, и программу проверки будет жаловаться (например, в данном случае), что он не имеет типа' IO Ā' –

4

Нет простого способа сделать это. Если ваша функция something находится в глобальной области, вы можете проверить тип этой функции. Если он действительно находится в вашей основной функции, его тип будет IO SomeType, где SomeType - это, вероятно, то, что вы ищете.

12

Существует Hacky способ:

main = do 
     x <- something 
     foo x 

где foo любая старая функция, которая не принимать аргумент типа вы думаете x может быть. Вы получите хорошую ошибку от GHC, которая включает тип, ожидаемый foo, и тип, фактически переданный в.

+0

Мне это нравится. Да, это взломать, но это просто и работает. –

3

Другим вариантом является Scion, который является в основном внешней оболочкой над GHC api, которая выступает в качестве сервера, предоставляющего IDE-подобные возможности для таких редакторов, как Emacs и Vim.

В readme в нем упоминается «экспериментальная» команда C-c C-t, которая показывает тип идентификатора в точке, включая локальные идентификаторы. Однако это будет работать, только если ваш тип файла проверяется.

Это позволяет узнать тип локального объявления без компиляции вашего файла или загрузки в GHCi, что означает, что он не нарушит ваш поток мысли.

2

Это своего рода очевидный отказ от ответа. Учитывая локальное связывание формы

x <- something 

Для того, чтобы знать тип x, вы просто должны знать тип something. Данный something имеет тип m a (для некоторых Монад m), x поэтому должен иметь тип a.

+0

Да, это, несомненно, верно, но иногда это становится немного сложнее. Приятно иметь возможность напрямую проверять. –

5

Вы можете использовать GHCI Debugger:

> ghci a.hs 
GHCi, version 7.0.4: http://www.haskell.org/ghc/ :? for help 
Loading package ghc-prim ... linking ... done. 
Loading package integer-gmp ... linking ... done. 
Loading package base ... linking ... done. 
Loading package ffi-1.0 ... linking ... done. 
[1 of 1] Compiling Main    (a.hs, interpreted) 
Ok, modules loaded: Main. 
*Main> :break 4 
Breakpoint 0 activated at a.hs:4:8-14 
*Main> :main 
Stopped at a.hs:4:8-14 
_result :: IO String = _ 
[a.hs:4:8-14] *Main> :list 
3 main = do 
4 x <- getLine 
      ^^^^^^^ 
5 return x 
[a.hs:4:8-14] *Main> :step 
asd 
Stopped at a.hs:5:3-10 
_result :: IO String = _ 
x :: String = _ 
[a.hs:5:3-10] *Main> :t x 
x :: String 
Смежные вопросы