在Haskell中是否有办法检查模块是否导出与另一个模块相同的功能?

时间:2015-10-07 13:48:42

标签: haskell

我有一些规范(用HSpec编写),并希望有一个测试,检查某些功能的重新导出是否按预期进行。

代码:

https://github.com/Wizek/compose-ltr/blob/ab954f00beb56c6c1a595261381d40e7e824e3bc/spec/Spec.hs#L4

如果我进入这个文件,如果我手动切换第4行或第5行被注释掉,我可以使用import运行所有测试。是否有一种简单的方法可以确保两个模块都导出相同的功能?

我想到的第一件事是导入一个合格的模块,并检查是否相等:

(($>) == (ComposeLTR.$>)) `shouldBe` True
-- Or more succintly
($>) `shouldBe` (ComposeLTR.$>)

但这不起作用,因为函数不能直接比较,它们不属于Eq类型类。

我能想到的唯一可以自动运行的是导入限定并为所有4个函数定义QuickCheck属性,如下所示:

import qualified ComposeLTR

it "should re-export the same function" $ do
  let
    prop :: (Fun Int Int) -> Int -> Bool
    prop (Fun _ f) g = (g $> f) == (g ComposeLTR.$> f)
  property prop

-- ... Essentially repeated 3 more times

但这看起来非常冗长和多余。是否有一种优雅的方式来检查这个?

1 个答案:

答案 0 :(得分:1)

您可以在IO中使用StableName

Prelude Data.List System.Mem.StableName> v  <- makeStableName   Prelude.takeWhile
Prelude Data.List System.Mem.StableName> v' <- makeStableName Data.List.takeWhile
Prelude Data.List System.Mem.StableName> v == v'
True