И опять глупый вопрос про IO...

Mar 03, 2010 00:13

Ну вот, в предыдущих сериях, при помощи знатоков,
мы выяснили, что бинд по первому аргументу строгий.

А теперь, упрощая, допустим, что у меня есть что-то,
получающее из IO по одному символу, ну типа getChar,
и как теперь мне получить ленивую строчку,
чтобы например, обрабатывать регэкспами?

Leave a comment

Comments 8

thesz March 2 2010, 21:09:02 UTC
unsafeInterleaveIO.

Reply

nivanych March 2 2010, 21:29:55 UTC
О, спасибо!
Завтра попробую, заодно, всякие регэкспы посравниваю.

Reply

thesz March 2 2010, 22:09:54 UTC
И, кстати, не рекомендую использовать его напрямую в конечном коде.

Могут утекать ресурсы (память и handles).

Лучше сделать преобразование в те же потоковые процессоры, будет безопасней.

Reply

nivanych March 2 2010, 22:12:33 UTC
Я и хотел поток, но подумал, что может быть,
есть какой-то совсем простой и тупой код...
Впрочем, ненамного сложнее будет.

Reply


alexey_rom March 2 2010, 21:14:19 UTC
Только через unsafeInterleaveIO (или unsafePerformIO), насколько я понимаю.

Вот как реализовано hGetContents в GHC:
http://hackage.haskell.org/packages/archive/base/3.0.3.1/doc/html/src/GHC-IO.html#lazyRead

Reply


ex_juan_gan March 2 2010, 21:48:39 UTC
напр.

import System.IO
import qualified Data.ByteString.Lazy as L
import qualified Data.ByteString.Lazy.Char8 as C
import Data.Word
import Text.Printf

convert :: [Word8] -> String
convert = concat . (map (printf "%02x"))

bytes2hex = convert . L.unpack

main = do
hSetBinaryMode stdin True
bin <- L.getContents
putStrLn (bytes2hex bin)

Или я неправ?

Reply

lomeo March 2 2010, 21:57:21 UTC
допустим, что у меня есть что-то, получающее из IO по одному символу

Так что тут действительно только

readAll :: [Char]
readAll = do
c <- unsafeInterleaveIO getChar
cs <- unsafeInterleaveIO readAll
return (c:cs)

Reply

nivanych March 3 2010, 07:22:26 UTC
Только мне надо это не для getChar, а из COM-порта читать.
Ладно. Потоки, это правильно, и нечего мне тут выдуривать.

Reply


Leave a comment

Up