такие нестрогие
Dec. 6th, 2011 11:35 pmВопрос знатокам и любителям языков с нестрогой семантикой. Вот код на Clean с созданием массива с помощью array comprehension. Сколько раз будет вызвана функция f?
Ответ профайлера: код проработал целых 6 секунд, массив tab был создан и собран мусорщиком 10000 раз (400 мегов аллоцировав), функция f вызвана 100 миллионов раз. А чо, чистота, ленивость и referential transparency. :)
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. :)
no subject
Date: 2011-12-06 08:09 pm (UTC)no subject
Date: 2011-12-06 08:23 pm (UTC)no subject
Date: 2011-12-06 10:40 pm (UTC)no subject
Date: 2011-12-07 02:41 am (UTC)http://thedeemon.livejournal.com/37515.html
no subject
Date: 2011-12-07 05:10 am (UTC)no subject
Date: 2011-12-07 06:30 am (UTC)Кстати, вот в таком варианте именно так и происходит:
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, компилятор чудит и делает многократные его вычисления.
no subject
Date: 2011-12-07 07:58 am (UTC)Уже очень давно, как с этими словами ассоциируют Haskell, у которого не так и недавно уже довольно более другой компилятор, чем у Clean.
no subject
Date: 2011-12-07 08:59 am (UTC)