这些示例是否正确,或者本教程有错误?

时间:2019-05-29 13:24:04

标签: haskell liquid-haskell

我正在阅读this tutorial,但不确定我是否正确理解文本(或整体上是正确的)。有一个例子:

  

以下谓词是有效的,因为它们对惯用语进行编码:   如果您知道a暗示b并且您知道a为真,那么它必须   b也成立的情况:

{-@ ex6 :: Bool -> Bool -> TRUE @-}
ex6 a b = (a && (a ==> b)) ==> b

{-@ ex7 :: Bool -> Bool -> TRUE @-}
ex7 a b = a ==> (a ==> b) ==> b

和ex6很好,但ex7不好,对于a = falseb = false来说失败。 LH将其报告为:

Error: Liquid Type Mismatch

 88 | ex7 a b = a ==> (a ==> b) ==> b
      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

   Inferred type
     VV : {v : GHC.Types.Bool | v <=> ((a => (a => b)) => b)}

   not a subtype of Required type
     VV : {VV : GHC.Types.Bool | VV}

   In Context
     a : GHC.Types.Bool

     b : GHC.Types.Bool

我也不理解他们对含义的定义:“您应该读p ==> q就像p是true一样,q也必须是true”。它听起来不正确,因为它仅断言一种情况:T -> T = T。我在这里想念什么?可能是教程“ ex7”中有错误?

1 个答案:

答案 0 :(得分:4)

在示例中,我怀疑他们使(==>)右联想,而在您的测试中,您将其保留为默认值,即默认为联想。比较:

> infixl 9 ==>; False ==> x = True; True ==> x = x
> False ==> (False ==> False) ==> False
False
> infixr 9 ==>; False ==> x = True; True ==> x = x
> False ==> (False ==> False) ==> False
True

Report有更多详细信息。