我嘗試寫一些規格的Data.Ratio
模塊。到目前爲止,我有:LiquidHaskell:試圖用假設的關鍵字,但數據類型不是數字
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
作爲後置條件,根據Data.Ratio
模塊的說明文檔是不可能的。顯然液體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
關鍵字如果它明顯didn'通過與函數實現進行比較來驗證我的精化類型的正確性? - 我是正確的思維,我應該用
assume
關鍵字? - 爲什麼
a
突然沒有數字?當我沒有使用assume
時不是數字嗎?不幸的是