你如何检查局部变量的类型?

Nic*_*unt 17 haskell types ghci

简单的问题.是否可以检查仅在函数内存活的变量的类型?

例如:

main = do
       x <- something
Run Code Online (Sandbox Code Playgroud)

我该如何检查x

我不能:type x在ghci 做,因为x不是全球性的.

dyi*_*ynx 13

另一种方式(与RobAgar和hacky非常相似)是明确指定有问题的局部变量的某种错误类型,例如:

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

那么ghci会给我们一个错误:

Couldn't match expected type `()' with actual type `[String]'
Run Code Online (Sandbox Code Playgroud)

这表明"x"的实际类型是[String].

  • 实际上,假设`x`*不具有与do块相同的monadic类型,你甚至不必将它转换为单位.只需将`x`放在do块的自己的行上,并且类型检查器会抱怨(例如,在这种情况下)它没有类型`IO a` (2认同)

Rob*_*gar 12

有一种hacky方式:

main = do
       x <- something
       foo x
Run Code Online (Sandbox Code Playgroud)

哪个foo是旧函数,它不会考虑你认为x可能的类型.你会从GHC得到一个很好的错误,包括期望foo 的类型和实际传入的类型.


ayc*_*can 5

您可以使用GHCi调试器:

> 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
Run Code Online (Sandbox Code Playgroud)