как лень победить?

May 31, 2006 13:45

Не очень понимаю, как сделать некоторые вычисления eager. Кто знает, подскажите.
Допустим у меня есть простой шелл - State с одной целой переменной. В шелле поддерживается две команды
  • r - прочесть целое значение
  • w - вывести целое значение
Вот код:

тут код )

haskell, lazy evaluation, программирование

Leave a comment

Comments 6

9000 May 31 2006, 10:47:14 UTC
Вроде есть оператор "!", заставляющий вычислить выражение сейчас же?

Reply

lomeo May 31 2006, 11:08:06 UTC
этот тип так аннотируется, мол, при создании конструктором значения, этот параметр будет вычисляться форсированно.

Reply


thesz May 31 2006, 10:50:55 UTC

*Main> :t ($)
($) :: (a -> b) -> a -> b
*Main> :t ($!)
($!) :: (a -> b) -> a -> b
*Main> ($!) id (error "aaa")
*** Exception: aaa
*Main> ($) id (error "aaa")
*** Exception: aaa
*Main> ($) (const 10) (error "aaa")
10
*Main> ($!) (const 10) (error "aaa")
*** Exception: aaa
*Main>

Что надо сменить:

cmdRead :: String -> TestShell
cmdRead x =
do let i = read x
put $! i
return ()

f $! x = форсировать x и вычислить (f x).

Reply

lomeo May 31 2006, 11:07:19 UTC
Спасибо! Я про $! знал, но что то не получалось. Уж куда я его только не прикладывал. В реальной программе, разумеется, сложный тип, а не Int, пришлось еще в самом типе ставить в одном месте $!, и еще в одном !. Но зато заработало!

Reply


а еще.. igor_ozerov June 23 2006, 08:50:50 UTC
а еще вроде как есть функция strict

Reply

Re: а еще.. lomeo June 23 2006, 09:13:43 UTC
где?

Reply


Leave a comment

Up