Haskell:如何测试未编译的代码?

标签 haskell typechecking gadt

测试声明类型不正确的最佳方法是什么?使用 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/

相关文章:

command-line - 在 Haskell 命令行应用程序中提示输入密码

haskell - 使用 haskell 的 collat​​z-list 实现

ruby - 在编译过程中何时/何地发生类型检查

python - 检查 python 列表是否有任何元素是字符串类型

haskell - GADT 的实际使用

haskell - 如何为 Haskell 语言程序制作 Makefile?

haskell - 如何在optparse-applicative中获取 "leftover arguments"?

performance - 检查 Perl 函数参数值得吗?

haskell - 我怎样才能对我的 GADT 进行脱糖?

haskell - 为什么 ghc 不能在这个 Category 产品上匹配这些类型?