在haskell脚本中将表达式转换为描述其类型的字符串?

在haskell脚本中将表达式转换为描述其类型的字符串?,haskell,ghc,ghci,Haskell,Ghc,Ghci,我们都知道,ghci中的:t给出了表达式的类型: Prelude> :t [1..] [1..] :: (Enum t, Num t) => [t] 我需要的是haskell脚本中的:t(我称之为typeStr): 可以在屏幕上打印类似于(Enum t,Num t)=>[t]的内容 可能吗 简短回答:不 Haskell通常不允许您编写在运行时之前类型未知的表达式,因此根本不需要运行时类型查找 尽管如此,还是有一些方法可以进行动态键入,而且似乎可以支持打印类型签名。。。但这可能根本不

我们都知道,
ghci
中的
:t
给出了表达式的类型:

Prelude> :t [1..]
[1..] :: (Enum t, Num t) => [t]
我需要的是haskell脚本中的
:t
(我称之为
typeStr
):

可以在屏幕上打印类似于
(Enum t,Num t)=>[t]
的内容

可能吗

简短回答:不

Haskell通常不允许您编写在运行时之前类型未知的表达式,因此根本不需要运行时类型查找

尽管如此,还是有一些方法可以进行动态键入,而且似乎可以支持打印类型签名。。。但这可能根本不是你想做的


另一种可能是使用模板Haskell在编译时查找类型签名。我不知道是否有人已经为此编写了代码…

是的,您可以,只要类型是
数据的实例。可键入的

import Data.Typeable
typeStr :: Typeable a => a -> String
typeStr a = show $ typeOf a

我不认为你会得到最一般的类型,但是,因为参数将是一个特定的类型。例如,
typeStr[1..]
在ghci中产生
[Integer]

是的,有几种方法

1。使用动态键入

对于单态类型的简单情况,可以使用可类型化实例:

Data.Dynamic> typeOf [1..]
[Integer]
2。使用运行时评估

但是,要正确地执行此操作(要获取多态值的类型),您需要完整的GHC类型检查器。例如,通过ghc api库及其漂亮的包装器:


哪个是使用完整的GHC类型检查器(动态调用)正确推断的类型。

为什么需要这样做?你的潜在问题是什么?我想写一个助手函数,可以给出表达式的结果和类型。如果你只想在ghci中使用这个函数,您应该在ghci提示下运行
:set+t
:它将随后告诉您输入的表达式类型,而通常它只告诉您它们的值。感谢您的建议,它在repl中确实有帮助,但在源文件中没有帮助。编译器可能会抱怨,因为(我猜)它对
:t
一无所知。。。
Data.Dynamic> typeOf [1..]
[Integer]
Language.Haskell.Interpreter> runInterpreter $ typeOf "[1..]"
Right "(P.Enum t, P.Num t) => [t]"