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].
Rob*_*gar 12
有一种hacky方式:
main = do
x <- something
foo x
Run Code Online (Sandbox Code Playgroud)
哪个foo是旧函数,它不会考虑你认为x可能的类型.你会从GHC得到一个很好的错误,包括期望foo 的类型和实际传入的类型.
您可以使用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)