Решил сегодня последние задачи по онлайн-курсу
https://www.edx.org/course/introduction-functional-programming-delftx-fp101x
Набрал 96% общего балла. В принципе мне курс понравился.
Единственный непонятный (точнее спорный) момент был вот такого рода
http://ru-declarative.livejournal.com/113979.html
Обещали еще по теории категорий подобный курс. Жду теперь :)
Еще бы поскорее прошел грипп, которым я вчера заболел ...
https://www.edx.org/course/introduction-functional-programming-delftx-fp101x
Набрал 96% общего балла. В принципе мне курс понравился.
Единственный непонятный (точнее спорный) момент был вот такого рода
http://ru-declarative.livejournal.com/113979.html
Обещали еще по теории категорий подобный курс. Жду теперь :)
Еще бы поскорее прошел грипп, которым я вчера заболел ...
Строгость к лени
Sep. 6th, 2014 12:30 amНедавно один коллега на работе, рассказывая о хаскеле в сравнении с другими функциональными языками (это был целый обзорный доклад такой у него для местной публики) высказал такое утверждение что дескать в хаскеле ну никак нельзя избавиться от ленивых вычислений и строго вычислить какое нибудь выражение. Я был несколько удивлен тогда такой информацией, но посколько хаскель знаю плохо, спорить не стал. И вот на днях, изучая издание "Algorithms. A functional approach" аж от 1999го года выпуска, где именно на хаскеле учат эффективно реализовывать эти самые алгоритмы, наткнулся на такую информацию что на самом деле в хаскеле есть стандартная функция-оператор $! которая делает ничто иное как строго вычисляет значение.
Более того, без этой самой возможности строго вычислить значение (то есть без оператора $!) в хаскеле вообще в принципе не работает хвостовая рекурсия - невычисленные значения лениво накапливаются в стеке.
Самое забавное это когда нужно строго вычислить сразу например пару значений:
(это мое решение для упражнения из книги :
3.4 Consider the following program:
prodsum x = prod x + sum x
prod 0 = 1
prod n = n * prod (n - 1)
sum 0 = 0
sum n = n + sum (n - 1)
(a) Change the definitions of sum and prod into tail-recursive ones.
(b) Using the Burstall-Darlington transformation system, write a new definition of prodsum (using tuples) such that the result is computed in one pass.
(c) Change this definition into one that avoids using tuples and which is tail- recursive.)
Но самое правильное решение конечно такое:
Более того, без этой самой возможности строго вычислить значение (то есть без оператора $!) в хаскеле вообще в принципе не работает хвостовая рекурсия - невычисленные значения лениво накапливаются в стеке.
Самое забавное это когда нужно строго вычислить сразу например пару значений:
prodsum n = x + y where (x, y) = f n (1,0) f n (a,b) | n == 0 = (a,b) | otherwise = (f (n-1)) $! ((n*a) `with` (n+b)) with a b = ((,) $! a) $! b
(это мое решение для упражнения из книги :
3.4 Consider the following program:
prodsum x = prod x + sum x
prod 0 = 1
prod n = n * prod (n - 1)
sum 0 = 0
sum n = n + sum (n - 1)
(a) Change the definitions of sum and prod into tail-recursive ones.
(b) Using the Burstall-Darlington transformation system, write a new definition of prodsum (using tuples) such that the result is computed in one pass.
(c) Change this definition into one that avoids using tuples and which is tail- recursive.)
Но самое правильное решение конечно такое:
prodsum' x = f x 0 1 where f 0 x y = x + y f n x y = (f (n-1) $! (n+x)) $! (n*y)