Data.Ratio
モジュールの仕様をいくつか記述しようとしています。これまでのところ私が持っている:LiquidHaskell:assumキーワードを使用しようとしましたが、データ型が数値ではありません
module spec Data.Ratio where
import GHC.Real
Data.Ratio.denominator :: GHC.Real.Integral a => r : GHC.Real.Ratio a -> {x:a | x > 0}
私は検証していたコードを次のとおりです。
{[email protected] die :: {v:String | false} -> a @-}
die msg = error msg
main :: IO()
main = do
let x = 3 % 5
print $ denominator x
if denominator x < 0
then die "bad ending"
else putStrLn "good ending"
分母が負の値を返すことはありませんので、コードは、安全と判断されます。
モジュールのドキュメントによると、私はちょうどx <= 0
をポストコンディションとして書いたことがあるので、これは奇妙です。明らかにLiquid Haskellは私の事後条件をdenominator
の実装と比較しません。
私の理解では、関数の実装が確認されていないため、私はキーワードを想定使ったほうが良いよということです。
assume Data.Ratio.denominator :: GHC.Real.Integral a => r : GHC.Real.Ratio a -> {x:a | x > 0}
しかし、私はそれから得る:
Error: Bad Type Specification assumed type GHC.Real.denominator :: (Ratio a) -> {VV : a | VV > 0} Sort Error in Refinement: {VV : a_a2kc | VV > 0} Unbound Symbol a_a2kc Perhaps you meant: papp5, papp3, papp4, head, papp2, papp7, papp6, papp1, tail because The sort a_a2kc is not numeric
は、私の質問は
です- この場合、LHではキーワードを使用しないようにしてください。関数の実装と比較して洗練された型の正確性を検証しますか?
- 私は
assume
キーワードを使うべきだと思っていますか? - どうして
a
が突然数値ではないのですか?私がassume
を使用しなかったときに数値ではなかったか?