LINUX.ORG.RU

Haskell strictness помогите


0

0

Есть фунуция которая создает только побочные эффекты foo x = do putStrLn ("test2"++show(x))

main::IO() main = do list<-return (map (foo) [1..10]) return ()

в результате ничего не выводится возможно сделать дополнительно функцию test2 [] = return () test2 (x:xs) = do tmp<-x test xs return ()

тогда вызов test2 list таки заставляет вычислять все, но это ужасно некрасиво еще пробовал использовать $!

foo x = do putStrLn ("Artem2"++show(x))

main::IO() main = do return (map (\x -> id $! (foo x)) [1..10]) return ()

по идее он должен сначала вычислить foo x но опять же ничего не происходит, никак не пойму в чем загвоздка компилятор GHC 6.8.2

anonymous

> main::IO() main = do list<-return (map (foo) [1..10]) return ()

Разумеется, здесь никаких побочных еффектов не вычисляется, а создается список ф-ций. Чтобы сделать побочный эффект, надо прибиндить его к монаде IO, что и делает ф-ция test2 -- в просторечии она зовется mapM_.

Strictness тут не при чем, просто надо различать ф-цию и ее "исполнение" (==bind) в монаде IO.

Итого -- main = mapM_ foo [1..10]

pierre
()

> по идее он должен сначала вычислить foo x

Так он это и сделал. Получил некое "действие". Теперь это действие нужно ВЫПОЛНИТЬ, что сам Хаскель, как чистый язык, сделать не может (гусары, молчать!). Выполнить действие может рантайм, но он выполняет только действие main. Поэтому, нужно сделать так, чтобы это действие стало частью main.

Твоё test2 на нормальном языке называется sequence_ (не забыть подчёркивание!), пошукай по хелпам, где оно (видимо, в Control.Monad).

Кстати, учти: хаскель не лисп, лишние скобки там ни к чему:

foo x = putStrLn $ "test2" ++ show x

И тэ пэ.

Miguel ★★★★★
()
Ответ на: комментарий от Miguel

Спасибо за подсказку, теперь знаю куда копать:)

anonymous
()
Ответ на: комментарий от Miguel

> Твоё test2 на нормальном языке называется sequence_

Ой, да, облажался я :-)

pierre
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.