9 Страницы « < 3 4 5 6 7 > »   
Ответить Создать тему

Функциональное программирование

jem
post Mar 9 2010, 13:14 
Отправлено #61


Активный

Сообщений: 4 908



Чуг&Кег, спасибо, почитаю на досуге.

Кстати, о птичках, как-то сложно сходу вникнуть в монады, но видимо это от того, что я совсем не знаком с теорией категорий и плохо знаком с абстрактной алгеброй вообще wink.gif

--------------------
C, Clojure(Script), Common Lisp, ECMAScript, Haskell, Java, Lua, Perl, PL/SQL, Python, Scala, SQL, Transact-SQL.
Profile CardPM
  0/0  
jem
post Mar 9 2010, 16:14 
Отправлено #62


Активный

Сообщений: 4 908



кстати, в последний листинг нужно было добавить такой промежуточный вариант:

Исходный код
>>do x <- [1..4]; return (do y <- [1..4]; return (x * y))
[[1,2,3,4],[2,4,6,8],[3,6,9,12],[4,8,12,16]]


--------------------
C, Clojure(Script), Common Lisp, ECMAScript, Haskell, Java, Lua, Perl, PL/SQL, Python, Scala, SQL, Transact-SQL.
Profile CardPM
  0/0  
Чуг&Кег
post Mar 9 2010, 21:48 
Отправлено #63


чайник

Сообщений: 1 136



Цитата(jem @ Mar 9 2010, 13:14)
Чуг&Кег,  спасибо, почитаю на досуге.

Кстати, о птичках, как-то сложно сходу вникнуть в монады, но видимо это от того, что я совсем не знаком с теорией категорий и плохо знаком с абстрактной алгеброй вообще wink.gif
*


оно там не надо, монады в функциональном программировании и в теркате, немножко разные вещи. Обычно для понимания монад, углублятся в глубины алгебры не требуется.

--------------------
пыщь пыщь, я идиод, убейте меня кто-нибудь, один один
Profile CardPM
  0/0  
Imp
post Mar 10 2010, 03:29 
Отправлено #64


Ъ

Сообщений: 4 518
Из: Пуэрто-Принцеса



Цитата(Чуг&Кег @ Mar 9 2010, 21:48)
оно там не надо, монады в функциональном программировании и в теркате, немножко разные вещи. Обычно для понимания монад, углублятся в глубины алгебры не требуется.
*

Ну вещь то одна, просто обычно в теркате несколько другие функции взяты за базовые. А вообще понять и пользоватся и "на пальцах" можно.
Но если немного почитать и мозг освободить то вообще жечь можно на монадах. Только это не сразу приходит.
Profile CardPM
  0/0  
jem
post Mar 11 2010, 12:57 
Отправлено #65


Активный

Сообщений: 4 908



Знатоки как-то могут объяснить такое поведение?

Исходный код
ghci>let double x = x + x
ghci>
ghci>double 1.1
2.2
ghci>let quadruple = double . double
ghci>
ghci>quadruple 1.1

<interactive>:1:10:
   No instance for (Fractional Integer)
     arising from the literal `1.1' at <interactive>:1:10-12
   Possible fix: add an instance declaration for (Fractional Integer)
   In the first argument of `quadruple', namely `1.1'
   In the expression: quadruple 1.1
   In the definition of `it': it = quadruple 1.1
ghci>
ghci>:t double
double :: (Num a) => a -> a
ghci>
ghci>:t quadruple
quadruple :: Integer -> Integer
ghci>


--------------------
C, Clojure(Script), Common Lisp, ECMAScript, Haskell, Java, Lua, Perl, PL/SQL, Python, Scala, SQL, Transact-SQL.
Profile CardPM
  0/0  
Чуг&Кег
post Mar 11 2010, 13:33 
Отправлено #66


чайник

Сообщений: 1 136



jem, Надо смотреть подробнее как вывод типов в хаскеле работает, я хаскель использую тока как пруф оф концепт, поэтому не особо в курсе. В F# это бы сломалось уже б на этом double 1.1 так как там сразу из функции double вывелся б тип Int.

зы. лечится это элементарно, просто аннотацию добавь к функции

Сообщение отредактировал Чуг&Кег - Mar 11 2010, 13:39

--------------------
пыщь пыщь, я идиод, убейте меня кто-нибудь, один один
Profile CardPM
  0/0  
jem
post Mar 11 2010, 13:59 
Отправлено #67


Активный

Сообщений: 4 908



Цитата(Чуг&Кег @ Mar 11 2010, 13:33)
зы. лечится это элементарно, просто аннотацию добавь к функции
*

Это понятно. Но вот почему автоматический вывод типов ведет себя таким странным образом - для меня непонятно. По идее, области определения и области значений этих функций должны совпадать.

--------------------
C, Clojure(Script), Common Lisp, ECMAScript, Haskell, Java, Lua, Perl, PL/SQL, Python, Scala, SQL, Transact-SQL.
Profile CardPM
  0/0  
jem
post Mar 12 2010, 11:09 
Отправлено #68


Активный

Сообщений: 4 908



В последнем листинге для полноты картины, так сказать, нужно было показать следующее:

Исходный код
ghci>:t (.)
(.) :: (b -> c) -> (a -> b) -> a -> c


--------------------
C, Clojure(Script), Common Lisp, ECMAScript, Haskell, Java, Lua, Perl, PL/SQL, Python, Scala, SQL, Transact-SQL.
Profile CardPM
  0/0  
Imp
post Mar 13 2010, 01:36 
Отправлено #69


Ъ

Сообщений: 4 518
Из: Пуэрто-Принцеса



Это называется Monomorphism restriction http://www.haskell.org/haskellwiki/Monomorphism_restriction
Надо либо написать тип явно, либо написать это все в одном файле чтобы компилятор при компиляции видел как вы его используете и выбрал правильный тип, либо отключить Monomorphism Restriction опциями компилятора (но это не по стандарту Haskell 98).
Profile CardPM
  0/0  
jem
post Mar 14 2010, 10:38 
Отправлено #70


Активный

Сообщений: 4 908



Цитата(Чуг&Кег @ Mar 9 2010, 21:48)
оно там не надо, монады в функциональном программировании и в теркате, немножко разные вещи. Обычно для понимания монад, углублятся в глубины алгебры не требуется.
*

Цитата(Imp @ Mar 10 2010, 03:29)
Ну вещь то одна, просто обычно в теркате несколько другие функции взяты за базовые. А вообще понять и пользоватся и "на пальцах" можно.
Но если немного почитать и мозг освободить то вообще жечь можно на монадах.
*

Таки курю теорию категорий, жду просветления smile.gif

Цитата(jem @ Mar 5 2010, 15:25)
[1,2,3,4] >>= \x -> return $ [1,2,3,4] >>= \y -> return $ x * y
*

Это можно переписать так:
Исходный код
ghci>[1..4] >>= return . \x -> [1..4] >>= return . \y -> x * y  
[[1,2,3,4],[2,4,6,8],[3,6,9,12],[4,8,12,16]]

Или так:
Исходный код
ghci>[1..4] >>= return . \x -> [1..4] >>= return . (x *)
[[1,2,3,4],[2,4,6,8],[3,6,9,12],[4,8,12,16]]


Сообщение отредактировал jem - Mar 14 2010, 11:42

--------------------
C, Clojure(Script), Common Lisp, ECMAScript, Haskell, Java, Lua, Perl, PL/SQL, Python, Scala, SQL, Transact-SQL.
Profile CardPM
  0/0  
jem
post Mar 17 2010, 18:53 
Отправлено #71


Активный

Сообщений: 4 908



Цитата(jem @ Mar 14 2010, 10:38)
Таки курю теорию категорий, жду просветления
*

В-общем, ознакомился по диагонали, так сказать. Как и говорил Водлер: "монада - это моноид в категории эндофункторов, какие проблемы-то" smile.gif А просветление, оказывается, было раньше, когда я представлял себе монады как некий механизм комбинации вычислительных процессов, аналогичный пайпам в юнихе.

--------------------
C, Clojure(Script), Common Lisp, ECMAScript, Haskell, Java, Lua, Perl, PL/SQL, Python, Scala, SQL, Transact-SQL.
Profile CardPM
  0/0  
Imp
post Mar 17 2010, 20:10 
Отправлено #72


Ъ

Сообщений: 4 518
Из: Пуэрто-Принцеса



Цитата(jem @ Mar 17 2010, 18:53)
В-общем, ознакомился по диагонали, так сказать. Как и говорил Водлер: "монада - это моноид в категории эндофункторов, какие проблемы-то" smile.gif А просветление, оказывается, было раньше, когда я представлял себе монады как некий механизм комбинации вычислительных процессов, аналогичный пайпам в юнихе.
*

Ну на самом деле это только один из эффектов. Монадические эффекты могут быть самые разные. Например можно поднимать (liftM) функции в монаду Maybe.
Profile CardPM
  0/0  
jem
post Mar 18 2010, 10:47 
Отправлено #73


Активный

Сообщений: 4 908



Цитата(Imp @ Mar 17 2010, 20:10)
Например можно поднимать (liftM) функции в монаду Maybe.
*

Дык, ясен пень, ведь монада это тройка из эндофунктора и двух естественных преобразований wink.gif На практике в Хаскелле конструктор типа - это эквивалент функтора для объектов, а liftM, соответственно, играет роль функтора для морфизмов (хотя, по моему, это должен делать Functor с его fmap`ом).

--------------------
C, Clojure(Script), Common Lisp, ECMAScript, Haskell, Java, Lua, Perl, PL/SQL, Python, Scala, SQL, Transact-SQL.
Profile CardPM
  0/0  
Imp
post Mar 18 2010, 12:02 
Отправлено #74


Ъ

Сообщений: 4 518
Из: Пуэрто-Принцеса



Цитата(jem @ Mar 18 2010, 10:47)
Дык, ясен пень, ведь монада это тройка из эндофунктора и двух естественных преобразований wink.gif На практике в Хаскелле конструктор типа - это эквивалент функтора для объектов, а liftM, соответственно, играет роль функтора для морфизмов (хотя, по моему, это должен делать Functor с его fmap`ом).
*

Я с практической точки зрения имел ввиду - когда на других языках приходится править код чтобы прокинуть эффект в хаскелле делаешь liftM и все готово. Правильно примененный liftM сильно упрощает работу.
Profile CardPM
  0/0  
Imp
post Mar 24 2010, 22:07 
Отправлено #75


Ъ

Сообщений: 4 518
Из: Пуэрто-Принцеса



Рекомендую "Structure and Interpretation of Computer Programs" классика как она есть - не совсем о ФП но примеры на Scheme в котором функциональная парадигма является основной. Позволяет заполнить пробелы в базовых знаниях и привести их в систему.
Profile CardPM
  0/0  

9 Страницы « < 3 4 5 6 7 > » 
ОтветитьTopic Options
1 чел. читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
Быстрый ответ
Кнопки кодов
 Расширенный режим
 Нормальный режим
    Закрыть все тэги


Открытых тэгов: 
Введите сообщение
Смайлики
smilie  smilie  smilie  smilie  smilie 
smilie  smilie  smilie  smilie  smilie 
smilie  smilie  smilie  smilie  smilie 
smilie  smilie  smilie  smilie  smilie 
smilie  smilie  smilie  smilie  smilie 
smilie  smilie  smilie  smilie  smilie 
         
Показать все

Опции сообщения