来自 C++,我习惯于构建简单形式的编译时断言,如果通过使用模板元不满足某些简单条件(例如,通过简单代数表达式),我可以在编译期间发出警告或错误-编程和/或cpp(1)
例如,如果我想确保我的程序仅在 Int
时编译。至少有一定的minBound
/maxBound
范围,或者,如果从 Int64
进行无损失(如可逆)转换至Int
可以使用当前的编译目标。这可以通过一些 GHC Haskell 扩展来实现吗?我的第一个猜测是使用 TH。是否有其他 GHC 设施可用于此目的?
最佳答案
这里是 Anthony's example 的通用和稍微简化的版本:
{-# LANGUAGE TemplateHaskell #-}
module StaticAssert (staticAssert) where
import Control.Monad (unless)
import Language.Haskell.TH (report)
staticAssert cond mesg = do
unless cond $ report True $ "Compile time assertion failed: " ++ mesg
return [] -- No need to make a dummy declaration
用法:
{-# LANGUAGE TemplateHaskell #-}
import StaticAssert
$(staticAssert False "Not enough waffles")
关于haskell - 使用 GHC Haskell 进行编译时断言?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6648764/