测试声明类型不正确的最佳方法是什么?使用 GADT,确定构造函数应用程序正确与否并非易事。如果一个人正在编写一个类型安全构造的库,那么确保不能创建非法构造是很自然的。因此,作为测试套件的一部分,我想确保类型检查器拒绝某些示例非法构造。
例如,请参阅大小检查向量表示。它比我想决定的典型问题简单得多,但它是检查测试方法的一个很好的例子。
data Vector n t where
EmptyVec :: Vector 0 t
ConsVec :: t -> Vector n t -> Vector (n+1) t
// TODO: test that it does not typecheck
illegalVec = ConsVec 'c' (ConsVec "b" EmptyVec)
最佳答案
您可以从 Haskell 程序中调用 GHCi 并使用它来检查字符串。 hint
from hackage 为此提供了一个方便的包装器:
{-# LANGUAGE DataKinds, TypeOperators, GADTs #-}
import GHC.TypeLits
import Language.Haskell.Interpreter
data Vector n t where
EmptyVec :: Vector 0 t
ConsVec :: t -> Vector n t -> Vector (n + 1) t
main = do
print =<< runInterpreter (typeChecks "ConsVec 'c' (ConsVec \"b\" EmptyVec)")
-- prints "Right False"
当然,这只是编写用于检查文本文件的脚本的一种更方便的替代方法,但我相信没有一种方法可以在 Haskell 中反射(reflect)类型检查本身,所以这就是我们所拥有的。
关于Haskell:如何测试未编译的代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25929349/