Компьютерный форум
Правила
Вернуться   Компьютерный форум > Форум программистов > Языки программирования > Haskell
Перезагрузить страницу Избежать повторных вызовов функции
Ответ
 
Опции темы Опции просмотра
  (#1 (permalink)) Старый
Vladimir the Red Sunny Vladimir the Red Sunny вне форума
Member
 
Сообщений: 4,232
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 15.05.2003
По умолчанию Избежать повторных вызовов функции - 13.09.2010, 07:27

Есть функция, которая довольно долго считает и возвращает тупл. Ну типа как-то так:

Код:
my_long_fn :: SomeData -> Something -> Something -> (SomethingElse, SomethingElse)
SomeData читается из файла в main. После этого надо в main брать по-отдельности элементы тупла и что-то с ними делать:

Код:
somedata <- read_data "file.dat"

fst $ my_long_fn somedata a b
snd $ my_long_fn somedata a b
Чтобы не вызывать my_long_fn несколько раз, написал дополнительную фунцкию

Код:
my_long_fnM somedata a b = do return (my_long_fn somedata a b)
и далее:

Код:
my_tuple <- my_long_fnM a b
fst my_tuple
snd my_tuple
В блок where, насколько я понимаю, вычисление my_tuple не засунешь из-за чтения файла, т. е. так не получится:

Код:
fst my_tuple
snd my_tuple
    where
        somedata <- read_data "file.dat"
        my_tuple = my_long_fn somedata a b
Написал уже для нескольких функций такие "заворачивалки в IO ()" и подумал, что должно быть что-то встроенное, либо вообще какой-то более правильный способ. Как?
Ответить с цитированием
  (#2 (permalink)) Старый
calabi-yau calabi-yau вне форума
Member
 
Сообщений: 338
Сказал(а) спасибо: 0
Поблагодарили 10 раз(а) в 10 сообщениях
Регистрация: 28.09.2009
По умолчанию 13.09.2010, 11:30

Цитата:
Сообщение от Vladimir the Red Sunny Посмотреть сообщение
Есть функция, которая довольно долго считает и возвращает тупл.
Код:
somedata <- read_data "file.dat"

fst $ my_long_fn somedata a b
snd $ my_long_fn somedata a b
Написал уже для нескольких функций такие "заворачивалки в IO ()" и подумал, что должно быть что-то встроенное, либо вообще какой-то более правильный способ. Как?
Можно связать/матчить в do let:
Код:
somedata <- read_data "file.dat"
let (fst', snd') = my_long_fn somedata a b
блок in не нужен.


Don't fear the Monad
Ответить с цитированием
  (#3 (permalink)) Старый
Vladimir the Red Sunny Vladimir the Red Sunny вне форума
Member
 
Сообщений: 4,232
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 15.05.2003
По умолчанию 13.09.2010, 14:40

let внутри do можно использовать так же, как в GHCi в интерактивном режиме? Т. е.:

Код:
do
    somedata <- read_data "file.dat"
    let (fst', snd') = my_long_fn somedata a b
    let (thd', frt') = my_even_longer_fn fst' snd'
    et_cetera
Ответить с цитированием
  (#4 (permalink)) Старый
calabi-yau calabi-yau вне форума
Member
 
Сообщений: 338
Сказал(а) спасибо: 0
Поблагодарили 10 раз(а) в 10 сообщениях
Регистрация: 28.09.2009
По умолчанию 13.09.2010, 15:44

Да, вроде того.


Don't fear the Monad
Ответить с цитированием
  (#5 (permalink)) Старый
Vladimir the Red Sunny Vladimir the Red Sunny вне форума
Member
 
Сообщений: 4,232
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 15.05.2003
По умолчанию 11.10.2010, 01:09

Кстати, а do let - ленивый или нет? А то периодически пытаюсь замерять время исполнения кусков кода, и конструкция:

[C] t0 <- getCPUTime
let data1 = time_consuming_computation x y z
t1 <- getCPUTime
print ((fromIntegral (t1 - t0))/1e12)[/C]

мне печатает какой-то нереалистично глубокий ноль. А для <- вроде нормально работала...
Ответить с цитированием
Ads.
  (#6 (permalink)) Старый
korvin korvin вне форума
Member
 
Аватар для korvin
 
Сообщений: 337
Сказал(а) спасибо: 1
Поблагодарили 15 раз(а) в 15 сообщениях
Регистрация: 25.01.2010
По умолчанию 11.10.2010, 01:34

<- тоже ленивые в общем-то =)
Ответить с цитированием
  (#7 (permalink)) Старый
Vladimir the Red Sunny Vladimir the Red Sunny вне форума
Member
 
Сообщений: 4,232
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 15.05.2003
По умолчанию 11.10.2010, 14:49

А как тогда правильно время выполнения измерять?
Ответить с цитированием
  (#8 (permalink)) Старый
calabi-yau calabi-yau вне форума
Member
 
Сообщений: 338
Сказал(а) спасибо: 0
Поблагодарили 10 раз(а) в 10 сообщениях
Регистрация: 28.09.2009
По умолчанию 11.10.2010, 15:46

Цитата:
Сообщение от Vladimir the Red Sunny Посмотреть сообщение
Кстати, а do let - ленивый или нет? А то периодически пытаюсь замерять время исполнения кусков кода, и конструкция:
просто сахарок для
Код:
do {let decls; stmts} = let decls in do {stmts}
т.е ленивый.

Цитата:
А как тогда правильно время выполнения измерять?
возможно эта библиотека поможет criterion, хотя если за точностью не гонимся, то
Код:
t0 <- getCPUTime

  let !data1 = time_consuming_computation x y z
  
  t1 <- getCPUTime

  print ((fromIntegral (t1 - t0))/1e12)


Don't fear the Monad
Ответить с цитированием
  (#9 (permalink)) Старый
korvin korvin вне форума
Member
 
Аватар для korvin
 
Сообщений: 337
Сказал(а) спасибо: 1
Поблагодарили 15 раз(а) в 15 сообщениях
Регистрация: 25.01.2010
По умолчанию 12.10.2010, 00:11

Цитата:
Сообщение от Vladimir the Red Sunny Посмотреть сообщение
А как тогда правильно время выполнения измерять?
с помощью time?

или например в ghci ввести
:s +t
Ответить с цитированием
  (#10 (permalink)) Старый
Vladimir the Red Sunny Vladimir the Red Sunny вне форума
Member
 
Сообщений: 4,232
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 15.05.2003
По умолчанию 12.10.2010, 06:56

Не интересует время выполнения всей программы - она там делает ио и кучу всего. Отдельные функции надо замерять, такой примитивный профайлинг. И программа под винду вообще.
Ответить с цитированием
  (#11 (permalink)) Старый
korvin korvin вне форума
Member
 
Аватар для korvin
 
Сообщений: 337
Сказал(а) спасибо: 1
Поблагодарили 15 раз(а) в 15 сообщениях
Регистрация: 25.01.2010
По умолчанию 13.10.2010, 20:41

про профилирование можно посмотреть, например, у Душкина "Практика работы на языке Haskell", вроде он что-то писал по этому поводу.
Ответить с цитированием
Ads
Ответ

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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как избежать щелканий CppWebBrowser AZzz C++ Builder 0 03.05.2008 21:30
Как избежать мерцания изображения при рисовании Sash&#39;Ok&#33; Visual C++ 10 21.09.2006 11:45
Количество вызовов функции Himem PHP 5 05.09.2006 14:19
Как избежать проблем при нажатие на клавишу tab Banan C++ Builder 4 30.05.2006 17:43
Работа с WinPCap как избежать ошибок AVinch Сетевое программирование 0 06.11.2005 22:46
Как избежать повторного включения header actung C++ Builder 3 18.02.2005 00:11
Перехват вызовов API LaMiK Visual C++ 5 15.02.2005 11:56
Как избежать дублирования randomize Sieman C++ Builder 3 25.03.2004 11:19
Как избежать проблем при работе с BDE drug Другие СУБД 0 18.03.2004 12:24
Подмена вызовов DLL при помощи ловушек Boris_Volkov Visual C++ 3 17.02.2004 12:51
Как избежать OutOfMemory TNT Java 3 02.09.2003 21:12
Как избежать моргания экрана Garik Assembler 4 22.07.2002 19:51



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