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