'半' Idris中的函数类型签名

时间:2016-11-30 22:30:11

标签: dependent-type idris

我对伊德里斯很陌生,我试图抓住基本的概念和语法。

即使这听起来毫无意义,我也试图定义一个将half函数减半的函数。

我想提出类似的事情:

half : (n : Nat) -> (k : Nat) -> (n = k + k) -> (k : Nat)

但当然它不起作用。具体来说,我得到:

  

错误:预期:依赖类型签名

half : (n : Nat) -> (k : Nat) -> (n = k + k) -> (k : Nat)

有可能吗?

感谢。

2 个答案:

答案 0 :(得分:6)

您想要表达的是half nNat个号码kn = k + k成立k。这样做的方法是使用sigma type,即数字n = k + k的依赖对和证明n = k + k(它是依赖对,因为类型第二个坐标k取决于第一个坐标{em}的half : (n : Nat) -> (k ** n = k + k) )。

Idris标准库为从属对定义DPair,包括允许你编写的一些语法糖

half

但请注意,您将无法实施half 1(作为总功能),因为没有好的答案,例如half : (n : Nat) -> (k ** Either (n = k + k) (n = k + k + 1)) 。也许你想要的是

{{1}}

答案 1 :(得分:0)

你不应该使用两次k。 一半:(n:Nat) - > (k:Nat) - > (n = k + k) - >纳特 是对的,但没用。 我想你需要 一半:(n:Nat) - >也许(k ** n = k + k)