繁体   English   中英

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

[英]Is there a way in Haskell to check whether a module exports the same functions as an other one?

我有一些规范(用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

但这似乎非常冗长和多余。 有一种优雅的方式来检查这个吗?

您可以在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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM