[Haskell-beginners] Re: problem with System.Directory.Tree

Anand Mitra mitra at kqinfotech.com
Mon Jul 5 22:01:58 EDT 2010


All the advice and help I got on my difficulties till now have been
very useful. My current problem is a little weird and can't
figure out what is happening.

I have been able to get the serialization working with DirTree based
on the suggestions I have received till now. I have a function calcMD5
which given a FilePath will traverse the entire tree calculating the
checksum of each file it encounters. The resultant structure is
serializable by encode. But when I do a encodeFile to store the result
to a file I get nothing.

,----
| *Main> calcMD5 "/tmp/tmp"
| AncTree "/tmp" (DirW {name = "tmp", contents = [FileW {name = "passwd",
file = Prop {md5sum = f54e7cef69973cecdce3c923da2f9222, modTime = Tue Jul  6
07:18:16 IST 2010, filenam = "/tmp/tmp/passwd"}}]})
|
| *Main> liftM encode $ calcMD5 "/tmp/tmp"
| Chunk
"\NUL\NUL\NUL\NUL\NUL\NUL\NUL\EOT/tmp\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\ETXtmp\NUL\NUL\NUL\NUL\NUL\NUL\NUL\SOH\SOH\NUL\NUL\NUL\NUL\NUL\NUL\NUL\ACKpasswd\NUL\245N|\239i\151<\236\220\227\201#\218/\146\"\NULL2\139`\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\SI/tmp/tmp/passwd"
Empty
`----

clearly the encoding is working.
But if I try to use encodeFile to write it to a file the file is not
created.

,----
| *Main> liftM (encodeFile "/tmp/tmp-list") $ calcMD5 "/tmp/tmp"
|
| $ ls /tmp/tmp-list
| ls: cannot access /tmp/tmp-list: No such file or directory
`----

I tried a few other things like converting the Bytestring from encode
into a string using show and then doing a writeFile on
it. Unfortunately none of them worked.

regards
-- 
Anand Mitra

On Mon, Jun 28, 2010 at 1:23 PM, Stephen Tetley <stephen.tetley at gmail.com>wrote:

> Hi Anand
>
> MD5Digest is an abstract type (the constructor is not exported from
> its module) but it is an instance of Binary.
> ClockTime (from System.Time) is not an instance of Binary but it does
> export its constructor.
> Neither are instances of Data.Data.
>
> So I would hand-craft an instance of Binary for the Props datatype
> rather than try to first make them instances of Data.
>
> The code will be something like this, as I don't have MD5 installed it
> is unchecked:
>
> class Binary Props where
>  put (Prop md5 tim name) =
>      do { putWord8 0     -- number each constructor
>         ; put md5        -- MD5Digest has a Binary instance
>         ; putTOD tim
>         ; put name
>         }
>
>  put Blank               =
>      do { putWord8 1 }   -- number each constructor
>
>  get = do { typ <- getWord8 -- get the constructor tag...
>           ; case typ of
>              0 -> getProp
>              1 -> return Blank
>           }
>
> getProp :: Get Props
> getProp = do
>    { md5 <- get
>    ; tim <- getTOD
>    ; name <- get
>    ; return (Prop md5 tim name)
>    }
>
>
> -- ClockTime doesn't have a binary instance
> -- but a it has a single constructor
> --
> -- > TOD Integer Integer -
> --
> -- and Integer has a Binary instance, so I
> -- would make auxillaris for put and get:
>
> putTOD :: ClockTime -> Put ()
> putTOD (TOD a b) = do { put a ; put b }
>
> getTOD :: Get ClockTime
> getTOD = do { a <- get; b <- get; return (TOD a b) }
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://www.haskell.org/pipermail/beginners/attachments/20100705/e367d8d1/attachment.html


More information about the Beginners mailing list