postulate
是否有关于Idris 中构造的性质和用途的最新信息?教程/手册中没有任何关于该主题的内容,我似乎也无法在 wiki 中找到任何内容。TIA。
问问题
688 次
1 回答
15
我认为我们将把 wiki 开发成更多此类事情的参考: https ://github.com/idris-lang/Idris-dev/wiki/Manual
的语法postulate
是:
postulate identifier : type
如在
postulate n : Nat
或者
postulate whyNot : 5 = 6
它引入了该类型的未指定值。当您需要一个您不知道如何引入的类型的实例时,这可能很有用。假设您要实现需要证明的东西,例如这个 Semigroup 类型类需要证明该操作是关联的,以便将其视为有效的半群:
class Semigroup a where
op : a -> a -> a
semigroupOpIsAssoc : (x, y, z : a) -> op (op x y) z = op x (op y z)
这很容易证明像 Nats 和 Lists 这样的东西,但是对于像机器 int 这样在语言之外定义操作的东西呢?您需要证明 semigroupOpIsAssoc 给出的类型签名是有人居住的,但在语言中缺乏这样做的方法。所以你可以假设这样一个东西的存在,作为告诉编译器“相信我这个”的一种方式。
instance Semigroupz Int where
op = (+)
semigroupOpIsAssoc x y z = intAdditionIsAssoc
where postulate intAdditionIsAssoc : (x + y) + z = x + (y + z)
具有类似假设的程序仍然可以运行和使用,只要任何假设的“值”都不能从运行时值中获得(它们的值是什么?)。这对于相等术语来说很好,除了类型检查之外不会在任何地方使用,并且在运行时会被删除。一个例外是其值可以被删除的术语,例如单人Unit
类型:
postulate foo : Unit
main : IO ()
main = print foo
仍然编译并运行(打印“()”);Unit
的实现实际上并不需要该类型的值show
。
于 2015-01-18T08:39:19.483 回答