Mar 03, 2010 00:13
Ну вот, в предыдущих сериях, при помощи знатоков,
мы выяснили, что бинд по первому аргументу строгий.
А теперь, упрощая, допустим, что у меня есть что-то,
получающее из IO по одному символу, ну типа getChar,
и как теперь мне получить ленивую строчку,
чтобы например, обрабатывать регэкспами?
Leave a comment
Comments 8
Reply
Завтра попробую, заодно, всякие регэкспы посравниваю.
Reply
Могут утекать ресурсы (память и handles).
Лучше сделать преобразование в те же потоковые процессоры, будет безопасней.
Reply
есть какой-то совсем простой и тупой код...
Впрочем, ненамного сложнее будет.
Reply
Вот как реализовано hGetContents в GHC:
http://hackage.haskell.org/packages/archive/base/3.0.3.1/doc/html/src/GHC-IO.html#lazyRead
Reply
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
Так что тут действительно только
readAll :: [Char]
readAll = do
c <- unsafeInterleaveIO getChar
cs <- unsafeInterleaveIO readAll
return (c:cs)
Reply
Ладно. Потоки, это правильно, и нечего мне тут выдуривать.
Reply
Leave a comment