1

是否有一些自动化工具可以在我的代码中找到过于具体的类型签名?对于一个人为的例子,假设我写

add3 :: Int -> Int
add3 = (+ 3)

是否有一些我可以运行的程序(比如“checkSingatures foo.hs”)告诉我我可以编写

add3 :: Num a => a -> a
add3 = (+ 3)

我认为这不会太难——去掉类型签名,看看 GHCi 推断什么。

4

1 回答 1

2

虽然我没有直接意识到这样的工具,但拥有它可能会很有趣(也许你可以向hlint维护者建议这个作为补充)。但是对于你的问题,我至少可以给你一个“起点”,实际上是一个 shell 脚本,它可以帮助你一点。

#!/bin/sh

sourceFile=$1
tempFile="`mktemp`.hs"

originalTypes=`mktemp`
inferedTypes=`mktemp`

ghc -fno-code -fforce-recomp -ddump-types $sourceFile 2>&1 | sed -n '/^TYPE/,/^TYPE/{/^TYPE/!p}' > $originalTypes
cat $sourceFile | grep -P -v "\s+.*?\s+::" > $tempFile
ghc -fno-code -fforce-recomp -ddump-types $tempFile 2>&1 | sed -n '/^TYPE/,/^TYPE/{/^TYPE/!p}' > $inferedTypes

diff $originalTypes $inferedTypes

当然,它不能很好地处理多行定义(可能还有许多其他情况),但它向您展示了您可以通过-ddump-types指令以可编写脚本的方式获取推断的类型。

于 2013-08-11T22:52:53.903 回答