:type是不够的,因为我想要的表达式可能包括本地定义的变量,如分配的事物<-,let或where.键入的孔(用_ghc 替换表达式并用ghc加载)很接近,但是它们会给你那里接受的内容,这可能比你好奇的表达式更通用.
我以为我找到了累积奖金:type-at,但是我不能像我希望的那样让它上班.使用此文件,名为"thing.hs":
something :: ()
something = ()
main :: IO ()
main = return something
Run Code Online (Sandbox Code Playgroud)
这是我使用时得到的结果:type-at:
> :set +c
> :l thing.hs
[1 of 1] Compiling Main ( thing.hs, interpreted )
Ok, one module loaded.
Collecting type info for 1 module(s) ...
> :type-at thing.hs 5 8 5 13 -- "return" on last line
<no location info>: error: not an expression: ‘’
> :type-at thing.hs 5 1 5 4 -- "main" on last line
:: IO ()
> :type-at thing.hs 5 15 5 23 -- "something" on last line
<no location info>: error: not an expression: ‘’
Run Code Online (Sandbox Code Playgroud)
这与使用基本相同:type.我希望我甚至能够通过它来return something获得Monad a => a ()或获得或IO ().如果可以在单独查看表达式的类型和"在该点"的表达式类型(在受到类型孔出现的类型限制之后)之间进行选择,那将会更加温和,但两者都可以.
当我尝试时:type-at thing.hs 5 8 5 14,我明白了:: () -> IO (). :type-at thing.hs 5 14 5 24同样有效:type-at thing.hs 5 14 6 1.
因此,右边界应该是表达式结尾的单元格.
有时人们可以简单地在表达前面使用一个类型的洞,你对作品感到好奇,使用这个洞就好像它是一个函数一样.例如
return (f 3)
---->
return (_ (f 3))
Run Code Online (Sandbox Code Playgroud)
通过这种方式,孔将被键入类似的东西WantedType -> OtherType,其中WantedType的类型f 3.
但这并不理想,因为这个漏洞会阻止类型推断来完成它的工作.即,有时类型f 3是多态的,其上下文强制它被实例化.例如,4 + length []使得4要Int,即使它可以是任何Num类型的.使用(_ 4) + length []引入任意Num类型(将被默认为Integer)和所需类型之间的函数Int,使得类型推断行为不正常.
相反,替代方案可以是使用翻译
return (f 3)
------>
return (f 3 `asTypeOf` _)
Run Code Online (Sandbox Code Playgroud)
对于类型推断,这应该更好,并返回正确的类型.
当然,弄清楚:type-at工作应该如何更好.不过,当你的编辑器已经在现场打开时,类型的漏洞技巧并不太不方便.