代码之家  ›  专栏  ›  技术社区  ›  Azathoth

当使用过滤器不删除任何案例时,涉及空列表的案例不会编译

  •  1
  • Azathoth  · 技术社区  · 2 年前

    对于作业,我必须编写一个函数 filter 在名单上 Maybe 实例,删除值为的所有 Nothing .我们应该确保该功能使用Hspec工作。

    在运行using之前和之后,使用包含元素的case很简单 Data.Maybe (isJust) :

    onlyJust :: [Maybe a] -> [Maybe a]
    onlyJust = filter isJust
    

    但是,一旦我尝试将该函数应用于测试用例,例如

    it "produces the list []" $
        onlyJust [Nothing, Nothing] `shouldBe` []
    

    it "produces the list []" $
        onlyJust [] `shouldBe` []
    

    测试套件文件未编译,导致类型错误不明确。

    • Ambiguous type variable ‘a0’ arising from a use of ‘shouldBe’
      prevents the constraint ‘(Show a0)’ from being solved.
      Probable fix: use a type annotation to specify what ‘a0’ should be.

    正如错误消息所示,我试图添加类型注释,但找不到与函数本身的类型约束匹配的注释。对于后一个测试用例,我还尝试通过添加一个空用例来修改函数:

    onlyJust :: [Maybe a] -> [Maybe a]
    onlyJust [] = []
    onlyJust l = filter isJust l
    

    但错误依然存在。我是在掩饰一个明显的类型注释来解决这个问题,还是在函数的编写方式上存在缺陷,这意味着它无法处理空列表的输出或将其作为输入?

    1 回复  |  直到 2 年前
        1
  •  1
  •   willeM_ Van Onsem    2 年前

    对于 onlyJust [Nothing, Nothing] 应该是 [] 它不知道该为 a 在里面 Maybe a 因此出现了错误。您可以添加类型提示,如:

    onlyJust ([Nothing, Nothing] :: [Maybe Int]) `shouldBe` []

    空列表也是如此:

    onlyJust ([] :: [Maybe Int]) `shouldBe` []

    请注意,已经有一个 catMaybes :: [Maybe a] -> [a] 过滤掉 Nothing s并从中打开项目 Just … 数据构造函数。

    推荐文章