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

Haskell 如何检查局部变量的类型?,haskell,types,ghci,Haskell,Types,Ghci,简单的问题。是否可以检查仅在函数中活动的变量的类型 例如: main = do x <- something main=do 没有简单的方法可以做到这一点。如果您的something函数在全局范围内,则可以检查该函数的类型。如果它真的在主函数中,它的类型将是iosometype,其中SomeType可能就是您要查找的 有一种老套的方法: main = do x <- something foo x main=do x另一种方法(与RobA

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

例如:

main = do
       x <- something
main=do

没有简单的方法可以做到这一点。如果您的
something
函数在全局范围内,则可以检查该函数的类型。如果它真的在主函数中,它的类型将是
iosometype
,其中
SomeType
可能就是您要查找的

有一种老套的方法:

main = do
       x <- something
       foo x
main=do
x另一种方法(与RobAgar和hacky的方法非常相似)是明确指定某些错误的局部变量类型,例如:

main = do
  x <- getArgs
  x :: () -- let's cast it to unit! ;)
  print $ head x
这表明“x”的实际类型是[String]。

另一个选项是,它基本上是GHC api上的外部包装器,充当服务器,为Emacs和Vim等编辑器提供类似IDE的功能

在自述文件中,它提到了“实验”命令
C-C-t
,该命令显示了该点的标识符类型,包括本地标识符。但是,这仅在文件类型检查时有效


这可以让您在不编译文件或加载到GHCi的情况下找到本地声明的类型,这意味着它不会太多地干扰您的思维流。

这是一种明显的非答案。给定表单的本地绑定

x <- something

x您可以使用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
>ghci a.hs
GHCi,7.0.4版:http://www.haskell.org/ghc/  :? 求救
正在加载程序包ghc prim。。。链接。。。完成。
正在加载包整型gmp。。。链接。。。完成。
正在加载包库。。。链接。。。完成。
正在加载包ffi-1.0。。。链接。。。完成。
[1/1]编译Main(a.hs,解释)
好的,模块已加载:Main。
*Main>:中断4
断点0在a.hs:4:8-14处激活
*Main>:Main
停在凌晨4:8-14
_结果::IO字符串=_
[a.hs:4:8-14]*Main>:列表
3 main=do
4 x:步骤
自闭症
停在a.hs:5:3-10
_结果::IO字符串=_
x::字符串=_
[a.hs:5:3-10]*Main>:tx
x::字符串

是的,这是不可否认的事实,但有时会变得有点复杂。能够直接检查很好。实际上,假设
x
与do块没有相同的一元类型,您甚至不必将其转换为unit。只需将
x
放在do块自己的行中,typechecker就会抱怨(例如,在本例中)它没有type
ioa
> 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