thedeemon: (Default)
[personal profile] thedeemon
Вопрос знатокам и любителям языков с нестрогой семантикой. Вот код на Clean с созданием массива с помощью array comprehension. Сколько раз будет вызвана функция f?

mkarr :: Int -> {#Int}
mkarr n = {tab.[j] - 1 \\ j <-[0..n-1]} where 
  tab :: {#Int}
  tab = {f i \\ i <- [0..n-1]}
  f :: Int -> Int
  f x = x + 5

Start world 
  # arr = mkarr 10000
  = arr.[9000]


Ответ профайлера: код проработал целых 6 секунд, массив tab был создан и собран мусорщиком 10000 раз (400 мегов аллоцировав), функция f вызвана 100 миллионов раз. А чо, чистота, ленивость и referential transparency. :)

Date: 2011-12-07 06:30 am (UTC)
From: [identity profile] thedeemon.livejournal.com
Формально тут tab должен быть ленивым значением типа "unboxed массив интов" и вычисляться один раз.

Кстати, вот в таком варианте именно так и происходит:
dummy :: {#Int}
dummy = {0}

mkarr4 :: Int -> {#Int}
mkarr4 n = { tab.[j] - 1 \\ j <- [0 .. n - 1] } where
  tab = if (1 < 0) dummy {f i \\ i <- [0 .. N - 1]}
  f x = x + 5 


Но стоит явно задать тип tab, компилятор чудит и делает многократные его вычисления.

Profile

thedeemon: (Default)
Dmitry Popov

February 2026

S M T W T F S
12 34567
891011121314
15161718192021
22232425262728

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Feb. 3rd, 2026 06:17 pm
Powered by Dreamwidth Studios