问题
我对使用LiquidHaskell感到非常兴奋,但是,我不知道我需要在多大程度上修改我的原始 Haskell 代码才能满足 LiquidHaskell 的要求。
这是一个简单的示例,说明 Liquid 的规范如何适用于String类型,但不适用于Text类型。
对于 String 类型,它工作得很好
例子
我定义了一个 Liquid 类型,我们说元组的值不能相同:
{-@ type NoRouteToHimself = {v:(_, _) | (fst v) /= (snd v)} @-}
然后,对于String类型规范,它可以很好地工作,如下所示:
{-@ strOk :: NoRouteToHimself @-}
strOk :: (String, String)
strOk = ("AA", "AB")
LiquidHaskel 输出 >>结果:安全
{-@ strBad :: NoRouteToHimself @-}
strBad :: (String, String)
strBad = ("AA", "AA")
LiquidHaskel 输出 >>结果:不安全
到目前为止一切顺利,让我们为 Text 类型定义相同的函数。
对于文本类型,它出错了
例子
{-# LANGUAGE OverloadedStrings #-}
import qualified Data.Text as Tx
{-@ foo :: NoRouteToHimself @-}
foo :: (Tx.Text, Tx.Text)
foo = ("AA", "AB")
预期结果: 结果:安全
LiquidHaskell 输出:结果:不安全
..Example.hs:102:3-5: Error: Liquid Type Mismatch
102 | foo = ("AA", "AB")
^^^
Inferred type
VV : {v : (Data.Text.Internal.Text, Data.Text.Internal.Text) | x_Tuple22 v == ?a
&& x_Tuple21 v == ?b
&& snd v == ?a
&& fst v == ?b}
not a subtype of Required type
VV : {VV : (Data.Text.Internal.Text, Data.Text.Internal.Text) | fst VV /= snd VV}
In Context
?b : Data.Text.Internal.Text
?a : Data.Text.Internal.Text
显然 LiquidHaskell 无法评估这种情况下元组的值。有什么建议么?