Сумма 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-27 10:32 pm (UTC)open import Data.Vec open import Data.Vec.N-ary open import Function add : ∀ n → N-ary n ℕ ℕ add n = curryⁿ $ sum {n}Слегка обобщенный sumType - это N-ary, который далее каррируется в вектор и сворачивается библиотечной же sum : ∀ {n} → Vec ℕ n → ℕno subject
Date: 2013-11-27 10:43 pm (UTC)no subject
Date: 2013-11-28 03:14 am (UTC)no subject
Date: 2013-11-28 09:33 am (UTC)Правильный компилятор (tm) должен выполнить статический контроль и сделать fusion.
no subject
Date: 2013-11-28 09:46 am (UTC)