我试图通过重建(以更简单的方式)我们最近在工作中做的一些事情来学习伊德里斯。
我希望有一种数据类型,可以使用信用向量和借方向量对总帐进行建模。我已经走到了这一步:
data GL : Type where
MkGL : (credits : Vect n Integer) ->
(debits : Vect m Integer) ->
(sum credits = sum debits) ->
GL
emptyGL : GL
emptyGL = MkGL [] [] Refl
但我不确定如何将记录添加到现有的GL中。
使用类似
的功能addTransactions : GL -> (Vect j Integer) -> (Vect k Integer) -> Maybe GL
如何根据规则检查/强制执行新GL?
答案 0 :(得分:3)
我认为我处理这种情况的方法是创建一个新的数据类型来表示具有给定总值的整数向量,如下所示:
||| A Vector of Integers with a given sum total
data iVect : Nat -> Integer -> Type where
iZero : iVect 0 0
iAdd : (x : Integer) -> iVect n y -> iVect (S n) (y + x)
data GL : Type where
MkGL : (credits : iVect n s) ->
(debits : iVect m s) ->
GL
emptyGL : GL
emptyGL = MkGL iZero iZero
你可能想要定义一个附加功能,以便更方便地更新GT,但你明白了。现在,信用和借方的相等性由类型系统强制执行,而不会产生繁重的义务,以明确证明每次要构建GL时两个任意向量的总和实际上是相等的。无论如何,它们都是相同的,但我所描述的是一种更实用的方法。