Haskell 这些例子是正确的还是教程有错误?

Haskell 这些例子是正确的还是教程有错误?,haskell,liquid-haskell,Haskell,Liquid Haskell,我正在阅读,我不确定我是否正确理解了课文(或者它是否完全正确)。有一个例子: 以下谓词是有效的,因为它们对modus ponens进行编码: 如果你知道a意味着b,并且你知道a是真的,那么它一定是真的 如果b也是正确的: ex6正常,但ex7不正常,它在a=false和b=false时失败。LH报告如下: Error: Liquid Type Mismatch 88 | ex7 a b = a ==> (a ==> b) ==> b ^^^^^^^^^^^^^^

我正在阅读,我不确定我是否正确理解了课文(或者它是否完全正确)。有一个例子:

以下谓词是有效的,因为它们对modus ponens进行编码: 如果你知道a意味着b,并且你知道a是真的,那么它一定是真的 如果b也是正确的:

ex6正常,但ex7不正常,它在
a=false
b=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
错误:液体类型不匹配
88 | ex7 a b=a==>(a==>b==>b
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
推断类型
VV:{v:GHC.Types.Bool|v((a=>(a=>b))=>b)}
不是所需类型的子类型
VV:{VV:GHC.Types.Bool|VV}
在上下文中
答:GHC.Types.Bool
b:GHC.Types.Bool

我也不理解他们对含义的定义:“你们应该读p==>q,就好像p是真的,那个么q也必须是真的。”。它听起来不正确,因为它只断言一种情况:
T->T=T
。我错过了什么?可能是教程在“ex7”中有错误?

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

> 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
报告还提供了进一步的细节

> 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