thedeemon: (office)
[personal profile] thedeemon
Описанная ниже функция 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
Вот так она описывается на Идрисе:
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? Че-то я торможу.

Date: 2013-11-28 03:14 am (UTC)
From: [identity profile] thedeemon.livejournal.com
Вместо одной дополнительной функции две. Плохое упрощение. :)

Date: 2013-11-28 09:33 am (UTC)
From: [identity profile] deni-ok.livejournal.com
Зато короткое!
Правильный компилятор (tm) должен выполнить статический контроль и сделать fusion.

Date: 2013-11-28 09:46 am (UTC)
From: [identity profile] thedeemon.livejournal.com
Ну, на самом деле наличие библиотечного решения игрушечной задачи не особо помогает в менее игрушечной, см. следующий пост.

Profile

thedeemon: (Default)
Dmitry Popov

December 2025

S M T W T F S
 12 3456
789101112 13
14151617181920
21222324252627
28293031   

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Jan. 29th, 2026 07:51 am
Powered by Dreamwidth Studios