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

时间:2012-02-09 11:48:43

标签: haskell types ghci

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

例如:

main = do
       x <- something

如何查看x的类型?

我无法在ghci中执行:type x因为x不是全局的。

6 个答案:

答案 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类型。