我想计算两个Natural
s 的商。我需要满足的要求是我有一些配置项必须动态定义为另一个的共享(即一个容器具有X
内存,该容器中进程的两个配置键定义为X / Y
和X / Z
)。
我的第一个想法是使用递归,但这种方法不起作用:
let quotient =
\(n: Natural) ->
\(m: Natural) ->
if lessThan n m then 0
else 1 + quotient (Natural/subtract m n) m
特别是,quotient
当我尝试调用它时,Dhall 抱怨说尚未定义。鉴于 Dhall 的全部功能范式(以及我对它的不熟悉),这似乎是合理的。我认为可能有某种方法可以做到这一点,但不幸的是我无法做到。
我使用Natural/fold
该方法进行了另一次尝试,但我不确定这是否有意义。
let quotient =
λ(n : Natural) →
λ(m : Natural) →
let div =
λ(n : Natural) →
λ(m : Natural) →
let Div = { q : Natural, r : Natural }
in Natural/fold
n
Div
( λ(d : Div) →
if Natural/isZero m
then d
else if lessThan d.r m
then d
else { q = d.q + 1, r = Natural/subtract m d.r }
)
{ q = 0, r = n }
in (div n m).q
这通过了以下所有断言。
let example1 = assert : quotient 1 1 ≡ 1
let example2 = assert : quotient 2 2 ≡ 1
let example3 = assert : quotient 3 1 ≡ 3
let example4 = assert : quotient 3 2 ≡ 1
let example5 = assert : quotient 9 4 ≡ 2
let example6 = assert : quotient 4 5 ≡ 0
let example7 = assert : quotient 0 1 ≡ 0
let example8 = assert : quotient 0 2 ≡ 0
let example9 = assert : quotient 1 0 ≡ 0
let example9 = assert : quotient 0 0 ≡ 0
let example9 = assert : quotient 2 0 ≡ 0
0
在我的情况下,除以时返回0
很好。
有没有更惯用的方法来实现这一目标?我在里面找了一个现成的整数除法函数Prelude
但是没找到。