thedeemon: (Default)
Вопрос знатокам и любителям языков с нестрогой семантикой. Вот код на 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. :)
thedeemon: (Default)
Думаю, многие из тех, кто знаком с Хаскелем, слышали, что есть еще такой язык Clean, который:
* чистый, ленивый, функциональный,
* знаменит своей эффективностью,
* похож на Хаскель, но
* обходится без монад для ввода-вывода и
* поддерживает изменяемые по месту структуры данных без потери ленивости и referential transparency за счет так называемых уникальных типов.

Я давно хотел познакомиться с ним поближе и прочувствовать что такое программирование с уникальными типами. Оказалось, что это не такое простое занятие (больше всего оно напоминает завязывание шнурков одной рукой), и чтобы написать что-то посложнее hello world'a и факториала нужно набрать определенный уровень навыков и понимания, в процессе пару раз вывихнув мозг. Теперь, когда я таки написал нетривиальную программу на нем (больше 1К строк и со штуками вроде уникальных деревьев из АТД с уникальными массивами), мне кажется, что я кое-что понял и могу поделиться.

Итак, все, что вы не хотели узнать о Clean и даже не думали спросить - под катом.
Read more... )

Profile

thedeemon: (Default)
Dmitry Popov

September 2017

S M T W T F S
     12
3456789
10111213141516
17181920212223
24252627282930

Syndicate

RSS Atom

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Sep. 26th, 2017 07:09 am
Powered by Dreamwidth Studios