伊德里斯的公设
Postulates in Idris
是否有任何关于 Idris 中 postulate
结构的性质和用途的最新信息? tutorial/manual 中没有关于该主题的任何内容,我似乎也无法在 wiki 中找到任何内容。 TIA.
我想我们要把 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 这样的东西来说,这很容易证明,但是对于像 machine int 这样的操作是在语言之外定义的东西呢?您需要证明 semigroupOpIsAssoc 给出的类型签名是有人居住的,但在语言中缺乏这样做的方法。所以你可以假设存在这样的东西,作为一种告诉编译器的方式 "just trust me on this one".
instance Semigroupz Int where
op = (+)
semigroupOpIsAssoc x y z = intAdditionIsAssoc
where postulate intAdditionIsAssoc : (x + y) + z = x + (y + z)
具有类似假设的程序仍然可以 运行 并使用,只要任何假设的 "values" 都无法从 运行 时间值(它们的值是多少?) .这对于相等项来说很好,除了类型检查外,它们不会在任何地方使用,并在 运行 时间被删除。一个例外是其值可以被删除的术语,例如单身人士 Unit
类型:
postulate foo : Unit
main : IO ()
main = print foo
仍然编译和 运行s(打印“()”); Unit
类型的值实际上并不是 show
.
的实现所需要的
是否有任何关于 Idris 中 postulate
结构的性质和用途的最新信息? tutorial/manual 中没有关于该主题的任何内容,我似乎也无法在 wiki 中找到任何内容。 TIA.
我想我们要把 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 这样的东西来说,这很容易证明,但是对于像 machine int 这样的操作是在语言之外定义的东西呢?您需要证明 semigroupOpIsAssoc 给出的类型签名是有人居住的,但在语言中缺乏这样做的方法。所以你可以假设存在这样的东西,作为一种告诉编译器的方式 "just trust me on this one".
instance Semigroupz Int where
op = (+)
semigroupOpIsAssoc x y z = intAdditionIsAssoc
where postulate intAdditionIsAssoc : (x + y) + z = x + (y + z)
具有类似假设的程序仍然可以 运行 并使用,只要任何假设的 "values" 都无法从 运行 时间值(它们的值是多少?) .这对于相等项来说很好,除了类型检查外,它们不会在任何地方使用,并在 运行 时间被删除。一个例外是其值可以被删除的术语,例如单身人士 Unit
类型:
postulate foo : Unit
main : IO ()
main = print foo
仍然编译和 运行s(打印“()”); Unit
类型的值实际上并不是 show
.