Проблема
Я был очень взволнован, играя с LiquidHaskell , однако я не знаю, в какой степени мне нужно изменить свой исходный код на Haskell для соответствия требованиям LiquidHaskell.
Вот простой пример того, как спецификации Liquid работают хорошо для типа String , но не для типа Text .
Для типа String это работает хорошо
Пример
Я определяю тип Liquid, где мы говорим, что значения кортежа не могут быть одинаковыми:
{-@ type NoRouteToHimself = {v:(_, _) | (fst v) /= (snd v)} @-}
Тогда для String *Спецификация типа 1021 * работает хорошо, как показано ниже:
{-@ strOk :: NoRouteToHimself @-}
strOk :: (String, String)
strOk = ("AA", "AB")
Выход LiquidHaskel >> РЕЗУЛЬТАТ: SAFE
{-@ strBad :: NoRouteToHimself @-}
strBad :: (String, String)
strBad = ("AA", "AA")
Выход LiquidHaskel >> RESULT: UNSAFE
Пока все хорошо, давайте определим ту же функцию для типа текста.
Для типа текста это не так
Пример
{-# 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 не может оценить значениякортежа для этого случая.Есть предложения?