简单的问题。是否可以检查在函数中仅存活的变量的类型?
例如:
main = do
x <- something
如何查看x
的类型?
我无法在ghci中执行:type x
因为x
不是全局的。
答案 0 :(得分:13)
另一种方式(与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]。
答案 1 :(得分:12)
有一种黑客的方式:
main = do
x <- something
foo x
其中foo
是不的任何旧函数,它采用您认为x
可能类型的参数。你会从GHC得到一个很好的错误,其中包括foo
所期望的类型以及实际传入的类型。
答案 2 :(得分: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
答案 3 :(得分:4)
没有简单的方法可以做到这一点。如果something
函数在全局范围内,则可以检查该函数的类型。如果它确实在你的main函数中,它的类型将是IO SomeType
,其中SomeType
可能就是你正在寻找的。
答案 4 :(得分:3)
另一个选项是Scion,它基本上是GHC api的外部包装器,它充当服务器,为Emacs和Vim等编辑器提供类似IDE的功能。
在自述文件中,它提到了“实验性”命令C-c C-t
,它显示了点上标识符的类型,包括本地标识符。但是,这仅在您的文件类型检查时才有效。
这使您可以在不编译文件或加载到GHCi中的情况下找出本地声明的类型,这意味着它不会破坏您的思维流程。
答案 5 :(得分:2)
这是一个明显的不答案。给定形式的本地绑定
x <- something
要了解x
的类型,您只需要知道something
的类型。鉴于something
的类型为m a
(对于某些Monad m
),因此x
必须具有a
类型。