在Haskell中查找太具体的类型签名

时间:2013-08-11 15:46:18

标签: haskell

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

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

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

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

我不认为这会太难 - 删除类型签名,看看GHCi推断的内容。

1 个答案:

答案 0 :(得分: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指令以脚本方式获取推断类型。