Re[13]: Total Functional Programming - сильное ФП
От: geniepro http://geniepro.livejournal.com/
Дата: 30.01.08 19:07
Оценка:
Здравствуйте, Курилка, Вы писали:

К> Ну значит Maybe и то и другое, а geniepro на неё (него?) посмотрел как на АТД, а я(ты?) как на монаду.


В Хаскелле Maybe -- это обычнейший АлгТД, для которого просто-напросто реализовали в Prelude инстанс класса Monad, добавив ему монадных операций... Пользоваться или не пользоваться этими операциями -- личное дело каждого... :о)
Maybe -- не только монада, но ещё и функтор... ;о)
-- Maybe type

data  Maybe a  =  Nothing | Just a      deriving (Eq, Ord, Read, Show)

maybe              :: b -> (a -> b) -> Maybe a -> b
maybe n f Nothing  =  n
maybe n f (Just x) =  f x

instance  Functor Maybe  where
    fmap f Nothing    =  Nothing
    fmap f (Just x)   =  Just (f x)
        
instance  Monad Maybe  where
    (Just x) >>= k   =  k x
    Nothing  >>= k   =  Nothing
    return           =  Just
    fail s           =  Nothing

Вот, кстати, даже с Maybe можно делать вычисления с дефолтным результатом для невалидных аргументов... ;о)

А интересно, монаду Either никто не делал? И есть ли смысл? :о)
Re[14]: Total Functional Programming - сильное ФП
От: deniok Россия  
Дата: 30.01.08 19:46
Оценка:
Здравствуйте, geniepro, Вы писали:

G>А интересно, монаду Either никто не делал? И есть ли смысл? :о)


У Either kind неподходящий для монады, слишком много типовых параметров (Either a b, целых две штуки). Можно, например, так:
instance Monad (Either String) where
 ...

и в String пихать сообщение об ошибке...
Re[11]: Total Functional Programming - сильное ФП
От: lomeo Россия http://lomeo.livejournal.com/
Дата: 31.01.08 08:17
Оценка:
Здравствуйте, geniepro, Вы писали:

G>Можно поступить не только так (Ваш пример не показателен, примем, например, расчёт корней кв. ур.):


G>
G>roots :: Double -> Double -> Double -> (MathResult Double, MathResult Double)
G>roots a b c = (x1, x2)
G>  where
G>    d = sqrt (b*b - 4*a*c)
G>    e = 1 / (2*a)
G>    (x1, x2) = case d of
G>                 Invalid -> (Invalid, Invalid)
G>                 Valid d -> case e of
G>                              Invalid -> (Invalid, Invalid)
G>                              Valid e -> (Valid (((-b)+d)/e), Valid (((-b)-d)/e))
G>

G>Ужос получился. :о))

Это именно то, что получилось и у меня Ужасом я бы это не назвал, но удобства от такого использования мало, а если скрыть все эти валид/инвалид, как это сделано у меня, то получим тот же error:

roots :: MathResult Double -> MathResult Double -> MathResult Double -> (MathResult Double, MathResult Double)
roots a b c = (x1, x2)
  where
    d = sqrt (b*b - 4*a*c)
    e = 1 / (2*a)
    (x1, x2) = (((-b)+d)/e, ((-b)-d)/e)


G>Вапще-то в данной задаче другого варианта поведения вроде как и не предусмотрено, а более подходящего примера в голову не идёт, блин...


Увы,

G>Однако предположим, что задача позволяет подставлять вместо d и e какие-то дефолтные значения в случае их невалидности. Тогда эта функция вполне может вернуть не MathResult Double, а просто Double... Неужели так трудно представить такой вариант?


Вполне. Но мы же хотим нарисовать арифметику для тотального языка, а значит нам надо рассмотреть все классы задач. Задачи с дефолтными значениями являются всего лишь подмножеством задач с MathResult как error, вот комбинатор (аналогичный fromMaybe):

withDefault :: Num n => n -> MathResult n -> n
withDefault n Invalid   = n
withDefault _ (Valid n) = n


Обратное, в общем то, неверно.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[10]: Total Functional Programming - сильное ФП
От: lomeo Россия http://lomeo.livejournal.com/
Дата: 31.01.08 08:17
Оценка:
Здравствуйте, geniepro, Вы писали:

L>>Э-э-э.. Не понял при чём тут IO.


G>Ну в смысле, что если в IO попадёшь, то хрен оттуда выберешся (учитывая, что в стандарте Хаскелл-98 нет unsafePerformIO)...


L>>Недостаток первого варианта я описал: однажды зайдя в Maybe, мы из него не выйдем.


G>Почему?


Потому что в стандарте тотал языка-08 нет fromJust (аналогичный unsafePerformIO).

Можно вытащить дефолтный параметр, но это очень специфично — зависит от задачи, т.е. как универсальное решение не проходит.

L>>Недостаток второго: неестественность некоторых результатов операций (как деление на 0, например), которая может привести к ошибкам в логике. Но тут я не поручусь — надо почитать как Runciman разбирается с этой проблемой.


G>Рунсиман предлагает два варианта: либо x/0=x, либо x/0=infinity, где infinity=1+infinity

G>Первый вариант неестественнен, второй запрещён в TFP...

Вот-вот.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[11]: Total Functional Programming - сильное ФП
От: Курилка Россия http://kirya.narod.ru/
Дата: 31.01.08 08:26
Оценка:
Здравствуйте, lomeo, Вы писали:

L>Потому что в стандарте тотал языка-08 нет fromJust (аналогичный unsafePerformIO).


А что такое "стандарт тотал языка-08"?
Re[12]: Total Functional Programming - сильное ФП
От: lomeo Россия http://lomeo.livejournal.com/
Дата: 31.01.08 08:37
Оценка:
Здравствуйте, Курилка, Вы писали:

L>>Потому что в стандарте тотал языка-08 нет fromJust (аналогичный unsafePerformIO).


К>А что такое "стандарт тотал языка-08"?


Смайлик забыл.

Я имел в виду, что в тотал языке нет fromJust, а значит выйти из Maybe в общем случае невозможно.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[13]: Total Functional Programming - сильное ФП
От: Курилка Россия http://kirya.narod.ru/
Дата: 31.01.08 08:40
Оценка:
Здравствуйте, lomeo, Вы писали:

L>Здравствуйте, Курилка, Вы писали:


L>>>Потому что в стандарте тотал языка-08 нет fromJust (аналогичный unsafePerformIO).


К>>А что такое "стандарт тотал языка-08"?


L>Смайлик забыл.


Подтупливаю с утреца

L>Я имел в виду, что в тотал языке нет fromJust, а значит выйти из Maybe в общем случае невозможно.


Угу, тут возражений нету
Re[13]: Total Functional Programming - сильное ФП
От: Аноним  
Дата: 31.01.08 10:42
Оценка:
L>Я имел в виду, что в тотал языке нет fromJust, а значит выйти из Maybe в общем случае невозможно.

вобще то выйти из Maybe можно при помощи maybe или fromMaybe
Re[14]: Total Functional Programming - сильное ФП
От: deniok Россия  
Дата: 31.01.08 12:09
Оценка: +1
Здравствуйте, Аноним, Вы писали:

L>>Я имел в виду, что в тотал языке нет fromJust, а значит выйти из Maybe в общем случае невозможно.


А>вобще то выйти из Maybe можно при помощи maybe или fromMaybe


Да это-то понятно, просто это всё эквивалент ручного протаскивания исключения + обработка (случай maybe), минимальная обработка (случай fromMaybe) или выпускание его на волю (fromJust)... Это всё недостаточно универсально
Re[15]: Total Functional Programming - сильное ФП
От: geniepro http://geniepro.livejournal.com/
Дата: 31.01.08 16:27
Оценка:
Ну так и что будем решать-то с этой арифметикой?
А то ещё хотелось бы обсудить проблемы субтипизации списков для тотальной реализации функции head...
Re[14]: Total Functional Programming - сильное ФП
От: lomeo Россия http://lomeo.livejournal.com/
Дата: 01.02.08 16:23
Оценка:
Здравствуйте, <Аноним>, Вы писали:

L>>Я имел в виду, что в тотал языке нет fromJust, а значит выйти из Maybe в общем случае невозможно.


А>вобще то выйти из Maybe можно при помощи maybe или fromMaybe


выделено. выйдите из Maybe для 1/0.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[16]: Total Functional Programming - сильное ФП
От: lomeo Россия http://lomeo.livejournal.com/
Дата: 01.02.08 16:23
Оценка:
Здравствуйте, geniepro, Вы писали:

G>Ну так и что будем решать-то с этой арифметикой?


Признать её невменяемой

Если серьёзно, то может разделить по типам. Пусть их будет две группы — одна с Maybe, другая с закрытой арифметикой.

G>А то ещё хотелось бы обсудить проблемы субтипизации списков для тотальной реализации функции head...


А зачем? Вот тут как раз всё в порядке — head вреден для здоровья.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[17]: Total Functional Programming - сильное ФП
От: geniepro http://geniepro.livejournal.com/
Дата: 01.02.08 19:57
Оценка:
Здравствуйте, lomeo, Вы писали:

G>>А то ещё хотелось бы обсудить проблемы субтипизации списков для тотальной реализации функции head...


L>А зачем? Вот тут как раз всё в порядке — head вреден для здоровья.


Ну, тоже решение. Хотя это уже отход от functional к declarative...
Re: Total Functional Programming - сильное ФП
От: Константин Л. Франция  
Дата: 04.02.08 21:12
Оценка:
Здравствуйте, Курилка, Вы писали:

простите что влязию своей небритой глупой мордой, но где можно доходчиво почитать про ваши бананы, и прочие умные вещи. выжимки бы
Re[2]: Total Functional Programming - сильное ФП
От: Курилка Россия http://kirya.narod.ru/
Дата: 04.02.08 21:32
Оценка: 6 (1)
Здравствуйте, Константин Л., Вы писали:

КЛ>Здравствуйте, Курилка, Вы писали:


КЛ>простите что влязию своей небритой глупой мордой, но где можно доходчиво почитать про ваши бананы, и прочие умные вещи. выжимки бы


К ТФП это правда отношения вроде непосредственного не имеет, но если хочется, начни с вики (статья про КАТАморфизм, он же банан, там же смотри ссылки на другие морфизмы), плюс там же ссылка на (возможно эпохальную ) статью Мейера, Фоккинги и Патерсона (вроде как Мейер по сути монады в линке к шарпу "прикрутил" )
Re[2]: Total Functional Programming - сильное ФП
От: geniepro http://geniepro.livejournal.com/
Дата: 05.02.08 07:39
Оценка: 6 (1)
Здравствуйте, Константин Л., Вы писали:

КЛ>простите что влязию своей небритой глупой мордой, но где можно доходчиво почитать про ваши бананы, и прочие умные вещи. выжимки бы


Бананы, линзы, оригами и примкнувшая к ним сегодня натуральность fold
Re[3]: Total Functional Programming - сильное ФП
От: deniok Россия  
Дата: 05.02.08 08:37
Оценка: 6 (1)
Здравствуйте, geniepro, Вы писали:

G>Здравствуйте, Константин Л., Вы писали:


КЛ>>простите что влязию своей небритой глупой мордой, но где можно доходчиво почитать про ваши бананы, и прочие умные вещи. выжимки бы


G>Бананы, линзы, оригами и примкнувшая к ним сегодня натуральность fold


Раз уж тут мой блог цитируют, то продолжение конспекта Bananas in Space:
Алгебры и катаморфизмы
Коалгебры и анаморфизмы
Ну и это всё-таки весьма сжатый конспект, хотя и с подробным разбором примеров.
Re[4]: Total Functional Programming - сильное ФП
От: Константин Л. Франция  
Дата: 05.02.08 09:07
Оценка:
Здравствуйте, deniok, Вы писали:

[]

Нам читали ФП, но то-ли я что-то прогулял, то-ли еще что, но про все это слышу в первый раз
Re[2]: Total Functional Programming - сильное ФП
От: lomeo Россия http://lomeo.livejournal.com/
Дата: 05.02.08 09:33
Оценка: 1 (1)
Здравствуйте, Константин Л., Вы писали:

КЛ>простите что влязию своей небритой глупой мордой, но где можно доходчиво почитать про ваши бананы, и прочие умные вещи. выжимки бы


Про бананы (свёртка, fold) можно почитать с самого начала в Why FP matters. Или в её русском переводе.

Вообще про свёртку рассказывается в любом учебнике ФП: SICP, The Craft of Functional Programming etc. Первое есть в русском переводе, кстати, можно в инете найти.

Интересно о свойствах свёртки написано в A tutorial on the universality and expressiveness of fold.

Более подробно про распространение свёртки на алгебраические типы, отличные от списков, можно почитать в Merging Monads and Folds for Functional Programming.

Изначально термин банан происходит из уже указывавшейся здесь классической Functional Programming with Bananas, Lenses, Envelopes and Barbed Wire.

С точки зрения теории категорий свёртка есть катаморфизм (специальный морфизм из initial F-алгебры). Для ознакомления можно почитать статью на вики — там есть и переложение на Haskell.

Также обсуждение свёртки неоднократно встречалость в этом форуме.

Это — бананы, а другие умные вещи — это что?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[3]: Total Functional Programming - сильное ФП
От: Константин Л. Франция  
Дата: 05.02.08 10:36
Оценка:
Здравствуйте, lomeo, Вы писали:

[]

L>Это — бананы, а другие умные вещи — это что?


околобанановые темы
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.