如何定义记录类型的元素?

时间:2015-06-01 10:22:17

标签: agda

我已将实数的数据类型定义为..

record ℝ : Set where
   field 
      L : Stream pair
      R : Stream pair
      inhabited : ∀ (x : pair) → ( (x mem L) or (x mem R)) 
      disjoint    : ∀ (x : pair) → ( (not (x mem L)) or (not (x mem R))) 
      located     : ∀ (x y : pair) → (x ≤pair y) → ((x mem L) or (y mem R))  

现在我要定义一个 R 类型的元素。我试着......

mkReal : Stream pair -> Stream pair -> R
mkReal x y = record { L = x; R = y}. 

但这不起作用请帮助。

1 个答案:

答案 0 :(得分:2)

您的记录有五个字段,LRinhabiteddisjointlocated。要定义的实例,您必须为所有五个字段提供值:

mkReal x y = record { L = x; R = y; inhabited = ?; disjoint = ?; located = ? }

您可能还必须将inhabiteddisjointlocated的值作为参数传递给mkReal

顺便说一下,有一种方法可以自动为记录定义构造函数:

record ℝ : Set where
   constructor mkReal
   field 
      L : Stream pair
      R : Stream pair
      inhabited : ∀ (x : pair) → ((x mem L) or (x mem R)) 
      disjoint    : ∀ (x : pair) → ((not (x mem L)) or (not (x mem R))) 
      located     : ∀ (x y : pair) → (x ≤pair y) → ((x mem L) or (y mem R))  

作为奖励,您现在可以在模式匹配时使用mkReal

foo : ℝ → ?
foo (mkReal L R inhabited disjoint located) = ?