Сумма N чисел
Nov. 28th, 2013 12:00 amОписанная ниже функция add принимает натуральное число n и n интов и возвращает сумму этих интов. Т.е.
add 0 == 0
add 1 42 == 42
add 2 33 44 == 77
add 8 2 2 2 2 2 2 2 2 == 16
Вот так она описывается на Идрисе:
Можно ли ее еще упростить и обойтись без вспомогательной функции adder? Че-то я торможу.
add 0 == 0
add 1 42 == 42
add 2 33 44 == 77
add 8 2 2 2 2 2 2 2 2 == 16
Вот так она описывается на Идрисе:
sumType : Nat -> Type sumType Z = Int sumType (S k) = Int -> sumType k adder : (n:Nat) -> Int -> sumType n adder Z acc = acc adder (S k) acc = \x => adder k (x + acc) add : (n:Nat) -> sumType n add Z = 0 add (S k) = adder k
Можно ли ее еще упростить и обойтись без вспомогательной функции adder? Че-то я торможу.
no subject
Date: 2013-11-29 10:10 am (UTC)add Z = 0
add (S Z) = ((add Z) +) -- could use id; this is a reduction step from a->sumType 0 to sumType 0
add (S k) = \ x y => add k (x + y) -- a general reduction step from b->a->sumType n to b->sumType n, eg k = S n
no subject
Date: 2013-11-29 10:28 am (UTC)Только последняя строчка такая:
add (S (S k)) = \x, y => add (S k) (x + y)
иначе он почему-то не догадывается, что k не Z, и потому не убежден, что add k - функция.
no subject
Date: 2013-11-29 01:19 pm (UTC)no subject
Date: 2013-11-30 09:38 am (UTC)folding : ∀ {n A} → (A → A → A) → sumT A (succ n) folding {zero} add z = z folding {(succ n)} add acc = λ x → folding {n} add (add acc x) add : (n : ℕ) → sumT ℕ n add n = folding {n} {ℕ} (_+_) zero- здесь zero добавляется с другого боку. Хотя не соответствует условию "одной функцией", но этот folding уже adder (за вычетом обобщения) (также, тривиально обобщается до "настоящего" фолда с типом функции (B → A → B)