Здравствуйте, Курилка, Вы писали:
К> Ну значит Maybe и то и другое, а geniepro на неё (него?) посмотрел как на АТД, а я(ты?) как на монаду.
В Хаскелле Maybe -- это обычнейший АлгТД, для которого просто-напросто реализовали в Prelude инстанс класса Monad, добавив ему монадных операций... Пользоваться или не пользоваться этими операциями -- личное дело каждого... :о)
Maybe -- не только монада, но ещё и функтор... ;о)
-- Maybe typedata 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 никто не делал? И есть ли смысл? :о)
Здравствуйте, 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
Здравствуйте, 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...
Здравствуйте, Курилка, Вы писали:
L>>Потому что в стандарте тотал языка-08 нет fromJust (аналогичный unsafePerformIO).
К>А что такое "стандарт тотал языка-08"?
Смайлик забыл.
Я имел в виду, что в тотал языке нет fromJust, а значит выйти из Maybe в общем случае невозможно.
Здравствуйте, 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
Здравствуйте, Аноним, Вы писали:
L>>Я имел в виду, что в тотал языке нет fromJust, а значит выйти из Maybe в общем случае невозможно.
А>вобще то выйти из Maybe можно при помощи maybe или fromMaybe
Да это-то понятно, просто это всё эквивалент ручного протаскивания исключения + обработка (случай maybe), минимальная обработка (случай fromMaybe) или выпускание его на волю (fromJust)... Это всё недостаточно универсально
Здравствуйте, <Аноним>, Вы писали:
L>>Я имел в виду, что в тотал языке нет fromJust, а значит выйти из Maybe в общем случае невозможно.
А>вобще то выйти из Maybe можно при помощи maybe или fromMaybe
Здравствуйте, geniepro, Вы писали:
G>Ну так и что будем решать-то с этой арифметикой?
Признать её невменяемой
Если серьёзно, то может разделить по типам. Пусть их будет две группы — одна с Maybe, другая с закрытой арифметикой.
G>А то ещё хотелось бы обсудить проблемы субтипизации списков для тотальной реализации функции head...
А зачем? Вот тут как раз всё в порядке — head вреден для здоровья.
Здравствуйте, lomeo, Вы писали:
G>>А то ещё хотелось бы обсудить проблемы субтипизации списков для тотальной реализации функции head...
L>А зачем? Вот тут как раз всё в порядке — head вреден для здоровья.
Ну, тоже решение. Хотя это уже отход от functional к declarative...
Здравствуйте, Константин Л., Вы писали:
КЛ>Здравствуйте, Курилка, Вы писали:
КЛ>простите что влязию своей небритой глупой мордой, но где можно доходчиво почитать про ваши бананы, и прочие умные вещи. выжимки бы
К ТФП это правда отношения вроде непосредственного не имеет, но если хочется, начни с вики (статья про КАТАморфизм, он же банан, там же смотри ссылки на другие морфизмы), плюс там же ссылка на (возможно эпохальную ) статью Мейера, Фоккинги и Патерсона (вроде как Мейер по сути монады в линке к шарпу "прикрутил" )
Здравствуйте, Константин Л., Вы писали:
КЛ>простите что влязию своей небритой глупой мордой, но где можно доходчиво почитать про ваши бананы, и прочие умные вещи. выжимки бы
Здравствуйте, geniepro, Вы писали:
G>Здравствуйте, Константин Л., Вы писали:
КЛ>>простите что влязию своей небритой глупой мордой, но где можно доходчиво почитать про ваши бананы, и прочие умные вещи. выжимки бы
G>Бананы, линзы, оригами и примкнувшая к ним сегодня натуральность fold
Здравствуйте, Константин Л., Вы писали:
КЛ>простите что влязию своей небритой глупой мордой, но где можно доходчиво почитать про ваши бананы, и прочие умные вещи. выжимки бы
Вообще про свёртку рассказывается в любом учебнике ФП: SICP, The Craft of Functional Programming etc. Первое есть в русском переводе, кстати, можно в инете найти.
С точки зрения теории категорий свёртка есть катаморфизм (специальный морфизм из initial F-алгебры). Для ознакомления можно почитать статью на вики — там есть и переложение на Haskell.
Также обсуждение свёртки неоднократно встречалость в этом форуме.