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-06 08:09 pm (UTC)
From: [identity profile] max630.livejournal.com
А что, у clean достаточно жив чтобы к нему можно было такие требования предъявлять?

Date: 2011-12-06 08:23 pm (UTC)
From: [identity profile] max has (from livejournal.com)
очень интересно, а как массивы укладываются в чистый ФП язык Clean. мутабельность, время доступа по индексу. в хаскеле Data.Array.IO т.е. не в мире чистых функций.

Date: 2011-12-06 10:40 pm (UTC)
From: [identity profile] nponeccop.livejournal.com
Uniqueness typing

Date: 2011-12-07 02:41 am (UTC)
From: [identity profile] thedeemon.livejournal.com
Вот тут про них подробно:
http://thedeemon.livejournal.com/37515.html

Date: 2011-12-07 05:10 am (UTC)
From: [identity profile] migmit.livejournal.com
Интересно, при чём тут ленивость?

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, компилятор чудит и делает многократные его вычисления.

Date: 2011-12-07 07:58 am (UTC)
From: [identity profile] nivanych.livejournal.com
> чистота, ленивость и referential transparency

Уже очень давно, как с этими словами ассоциируют Haskell, у которого не так и недавно уже довольно более другой компилятор, чем у Clean.

Date: 2011-12-07 08:59 am (UTC)
From: [identity profile] thedeemon.livejournal.com
Тут просто глюк забавный получился. Типа раз referential transparency, то не только можно вычисление выражения заменить его значением, но и наоборот - значение обратно заменить вычислением. :)

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 04:59 pm
Powered by Dreamwidth Studios