打印类型签名列表

ren*_*ick 5 haskell types

我希望能够在ghci中键入以下内容:

map showTypeSignature [(+),(-),show]
Run Code Online (Sandbox Code Playgroud)

我希望ghci返回以下字符串列表:

["(+) :: Num a => a -> a -> a","(-) :: Num a => a -> a -> a","show :: Show a => a -> String"]
Run Code Online (Sandbox Code Playgroud)

当然,我遇到麻烦的第一个地方是我无法构造第一个列表,因为函数的类型签名不匹配.我该怎么做才能构建这样一个列表?ghci如何完成类型签名的打印?ghci命令在哪里:t定义(其来源)?

kos*_*kus 7

你要求的是不可能的.您无法从Haskell中轻松确定Haskell术语的类型签名.在运行时,几乎没有任何类型信息可用.:t出于某种原因,GHCi命令是GHCi命令,而不是解释的Haskell函数.

要做一些接近你想要的事情,你必须使用GHC本身作为一个库.GHC为此目的提供GHC API.但是,您将无法使用任意Haskell术语,但必须从String您的术语表示开始.此外,在运行时调用编译器必然会产生IO输出.


lef*_*out 6

kosmikus是对的,这真的没有用.而且不应该,静态类型系统是Haskell的最大特色之一!

但是,您可以使用存在性来很好地模拟单态函数:Dynamic

showTypeSignature :: Dynamic -> String
showTypeSignature = show . dynTypeRep
Run Code Online (Sandbox Code Playgroud)

Prelude Data.Dynamic> map showTypeSignature [toDyn (+), toDyn (-), toDyn (show)]
["整数 - >整数 - >整数","整数 - >整数 - >整数","() - > [字符]"]

正如你所看到的那样,ghci必须将这些功能简化为单态类型才能使其正常工作,特别show是这种功能显然无用.