- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试为 Data.Ratio
编写一些规范模块。到目前为止我已经:
module spec Data.Ratio where
import GHC.Real
Data.Ratio.denominator :: GHC.Real.Integral a => r : GHC.Real.Ratio a -> {x:a | x > 0}
我正在验证的代码是:
{-@ 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
的文档模块是不可能的。显然 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 becauseThe sort a_a2kc is not numeric
我的问题是
assume
在这种情况下,关键字是否显然没有通过与函数实现进行比较来验证我的精炼类型的正确性?assume
对吗?关键字?a
突然不是数字了?我没用assume
的时候不就是数字吗?最佳答案
不幸的是,“Numeric”的字面意思是“Num”,甚至不是其子类。我们需要扩展 LH 以支持您上面描述的形式的子类;我会为此创建一个问题,感谢您的指出!
现在,如果您将您的类型专门化为,例如Int
或 Integer
那么 LH 会正确抛出错误:
import GHC.Real
{-@ assume denom :: r:GHC.Real.Ratio Int -> {x:Int | x >= 0} @-}
denom :: GHC.Real.Ratio Int -> Int
denom = denominator
{-@ die :: {v:String | false} -> a @-}
die msg = error msg
main :: IO ()
main = do
let x = 3 % 5
print $ denom x
if denom x <= 0
then die "bad ending"
else putStrLn "good ending"
http://goto.ucsd.edu:8090/index.html#?demo=permalink%2F1504739852_3583.hs
如果您将输出类型设置为x > 0
,那么它又是安全的。
http://goto.ucsd.edu:8090/index.html#?demo=permalink%2F1504739907_3585.hs
再次感谢您指出比率
问题!
关于haskell - LiquidHaskell : Trying to use assume keyword, 但数据类型不是数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45303881/
我最近开始使用 Liquid Haskell,从我能找到的所有教程中,我找不到如下所示的任何示例。 data MaybePerson = MaybePerson {
我正尝试在 LiquidHaskell 中做第一个练习 case study on Lazy Queues module Main where main :: IO () main = putStrL
我在用 LiquidHaskell 证明以下定律时遇到了麻烦: 它被称为(之一)德摩根定律,并简单地说明了 or 的否定。两个值必须与 and 相同否定每个。它已经被证明了很长时间,并且是 Liqui
我最近一直在玩 LiquidHaskell 和 Idris,我有一个非常具体的问题,我无法在任何地方找到明确的答案。 Idris 是一种依赖类型的语言,在大多数情况下都很棒。但是我读到类型检查期间的某
我正在尝试为 Data.Ratio 编写一些规范模块。到目前为止我已经: module spec Data.Ratio where import GHC.Real Data.Ratio.denomin
问题 我一直很兴奋玩 LiquidHaskell ,但是,我不知道我需要在多大程度上修改我原来的 Haskell 代码才能满足 LiquidHaskell 的要求。 这是一个简单的示例,说明 Liqu
我是一名优秀的程序员,十分优秀!