Компьютерный форум
Правила
Вернуться   Компьютерный форум > Форум программистов > Языки программирования > Haskell
Перезагрузить страницу стандартные библиотеки
Ответ
 
Опции темы Опции просмотра
  (#1 (permalink)) Старый
Jean-Esther Jean-Esther вне форума
Member
 
Сообщений: 22
Сказал(а) спасибо: 1
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 07.03.2009
По умолчанию стандартные библиотеки - 25.07.2011, 21:34

Спасайте, чего-то никак не получается понять, что пытались авторы сказать своим кодом

1. Чем liftM отличается от fmap?
Ведь fmap f m1 == m1 >>= return . f == do { x1 <- m1; return (f x1) }

2. Чем id отличается от lazy? У них же совершенно одинаковое определение!
Хотя, я догадываюсь, ответ скрывается в комментах ниже:
-- Implementation note: its strictness and unfolding are over-ridden
-- by the definition in MkId.lhs; in both cases to nothing at all.
-- That way, 'lazy' does not get inlined, and the strictness analyser
-- sees it as lazy. Then the worker/wrapper phase inlines it.
-- Result: happiness


P.S. в предпросмотре обратил внимание, что у меня ссылки не выделяются среди текста. Поэтому обращаю внимание: на идентификаторы я повесил ссылки на hoogle.
Ответить с цитированием
  (#2 (permalink)) Старый
calabi-yau calabi-yau вне форума
Member
 
Сообщений: 338
Сказал(а) спасибо: 0
Поблагодарили 10 раз(а) в 10 сообщениях
Регистрация: 28.09.2009
По умолчанию 26.07.2011, 00:55

Цитата:
Сообщение от Jean-Esther Посмотреть сообщение
1. Чем liftM отличается от fmap?
Ведь fmap f m1 == m1 >>= return . f == do { x1 <- m1; return (f x1) }
fmap мы вольны дать произвольную реализацию, где fmap f m1 == m1 >>= return . f может не выполняться.
Цитата:
Сообщение от Jean-Esther Посмотреть сообщение
2. Чем id отличается от lazy? У них же совершенно одинаковое определение!
Хотя, я догадываюсь, ответ скрывается в комментах ниже:
-- Implementation note: its strictness and unfolding are over-ridden
-- by the definition in MkId.lhs; in both cases to nothing at all.
-- That way, 'lazy' does not get inlined, and the strictness analyser
-- sees it as lazy. Then the worker/wrapper phase inlines it.
-- Result: happiness
хинт анализатору строгости для предотвращения нежелательных оптимизаций, если правильно понял, причем захардкожено.


Don't fear the Monad
Ответить с цитированием
  (#3 (permalink)) Старый
Jean-Esther Jean-Esther вне форума
Member
 
Сообщений: 22
Сказал(а) спасибо: 1
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 07.03.2009
По умолчанию 26.07.2011, 12:33

Ну, liftM требует от типа m быть монадой, а это значит, что return суть натуральное преобразование (1=>m). А это равенство является по сути натуральным квадратом для return. В принципе, мы действительно можем его нарушить, но только в этом нет никакой выгоды: логика будет нарушена, возможно, ghc попытается лишний раз оптимизовать. Нет повода давать реализацию, в которой liftM /= fmap. (но я согласен, такой случай действительно допускается языком)

А по lazy и id можешь привести хотя бы одну ситуацию, когда оптимизация будет лишней? Тогда они должны вести себя по-разному строго, что ли — не представляю.
Ответить с цитированием
  (#4 (permalink)) Старый
calabi-yau calabi-yau вне форума
Member
 
Сообщений: 338
Сказал(а) спасибо: 0
Поблагодарили 10 раз(а) в 10 сообщениях
Регистрация: 28.09.2009
По умолчанию 26.07.2011, 16:47

Цитата:
Сообщение от Jean-Esther Посмотреть сообщение
А по lazy и id можешь привести хотя бы одну ситуацию, когда оптимизация будет лишней? Тогда они должны вести себя по-разному строго, что ли — не представляю.
функции par и pseq
Цитата:
The lazy function restrains strictness analysis a little. The call (lazy e) means the same as e, but lazy has a magical property so far as strictness analysis is concerned: it is lazy in its first argument, even though its semantics is strict. After strictness analysis has run, calls to lazy are inlined to be the identity function.

This behaviour is occasionally useful when controlling evaluation order. Notably, lazy is used in the library definition of Control.Parallel.par:

par :: a -> b -> b
par x y = case (par# x) of _ -> lazy y
If lazy were not lazy, par would look strict in y which would defeat the whole purpose of par.


Don't fear the Monad
Ответить с цитированием
  (#5 (permalink)) Старый
Jean-Esther Jean-Esther вне форума
Member
 
Сообщений: 22
Сказал(а) спасибо: 1
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 07.03.2009
По умолчанию 25.08.2011, 01:44

Опять из раздела «Я ни#чего не понял»:
haskell Код:
fix :: (a -> a) -> a
fix f = let x = f x in x
В поисках ответа открыл справку, что привело к новым сложностям: как раскрыть let-нотацию ( Haskell 98: ), в частности let p = fix ( \ ~p -> e1) in e0

P.S. То есть как бы
haskell Код:
fix f = let x = fix ( \ ~x -> f x) in x
fix f = case fix ( \ ~x -> f x) of ~x -> x
fix f = (\ ~x -> x) (fix (\ ~x -> f x))
-- эта-равенство: \ ~x -> x == id; \ ~x -> f x == f
fix f = id (fix f) -- K.O.
Ответить с цитированием
Ads.
  (#6 (permalink)) Старый
calabi-yau calabi-yau вне форума
Member
 
Сообщений: 338
Сказал(а) спасибо: 0
Поблагодарили 10 раз(а) в 10 сообщениях
Регистрация: 28.09.2009
По умолчанию 28.09.2011, 16:14

Цитата:
fix f = id (fix f) -- K.O.
Возможно имеется ввиду fix без какой-либо конкретной реализации, а ваш код просто вырождается до оного (и вообще, например в ghc core рекурсивное let-связывание допустимо и является частью core).


Don't fear the Monad
Ответить с цитированием
Ads
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Основные стандартные модули *Юльчик* Delphi 7 18.06.2009 16:03
Как сменить стандартные значки Windows? Julce Любые вопросы от новичков 2 03.03.2009 22:53
Не воспроизводятся стандартные звуки Windows. NastYA- Любые вопросы от новичков 7 16.01.2009 18:11
Стандартные функции\предикаты ForsakenS Prolog 1 08.11.2008 12:37
Подключение библиотеки glut и объектной библиотеки .obj или .lib imported_evgenyan C++ Builder 6 14.10.2007 13:47
Стандартные запросы выборки, апдейта Samael6 Perl 0 25.04.2006 16:37
Как перерисовывать стандартные компоненты Романнист C++ Builder 7 05.04.2006 08:48
Стандартные библиотеки С++ Gal2005 С/С++ 33 20.10.2005 01:14
Стандартные потоки ввода вывода лисс Вопросы начинающих программистов 51 07.02.2005 19:55
Стандартные окна OpenFile & SaveAS Anonymous Visual C++ 5 03.05.2004 10:47
Стандартные кнопки заголовка Aist++ WinAPI 1 25.09.2003 12:58
Как используя стандартные библиотеки и компоненты сделать массим из трех элементов Ve-Ve Delphi 6 14.12.2002 22:07



Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Нardforum.ru - компьютерный форум и программирование, форум программистов