Re[2]: Stuck... is it even possible?
Bulat Ziganshin <[email protected]> Fri, 20 Jan 2006 23:46:15 +0300
| Newsgroups | gmane.comp.lang.haskell.template |
|---|---|
| Message-ID | <[email protected]> |
Hello Tim, Friday, January 20, 2006, 8:35:03 PM, you wrote: TN> Thank you. This makes a lot of sense. My only problem with this is TN> the declarations of the base types in the generator: TN> flen t | t == 'Word8 = return 1 TN> This precludes someone from adding other base types without modifying TN> the generator. as i initially understand, you are planned to use this lib only in your own app? anyway, this depends on how other things will be arranged. adding new type require some other support besides of modifying `flen`. how your imagine the scenario of this process? on the other side, sizes for enumerations can be calculated. number of other simple types are limited. all other types are complex, i.e. their sizes is a function of sized of types they contain on the third side :) you can try to rewrite instantiation so that it will not need to know these sizes at compile-time: >data IP = IP Word16 Word32 Word64 > >instance ByteContainer IP > containerLength (IP x1 x2 x3) = (containerLength x1)+ > (containerLength x2)+ > (containerLength x3) > > makeContainer b = IP > (makeContainer (Slice b 0)) > (makeContainer (Slice b offset1)) > (makeContainer (Slice b offset2)) > where offset1 = containerLength newWord16 > offset2 = offset1+containerLength newWord32 > > getByteAt (IP x0 x1 x2) n > | n >= offset2 = getByteAt x2 (n-offset2) > | n >= offset1 = getByteAt x1 (n-offset1) > | otherwise = getByteAt x0 n > > where offset1 = containerLength newWord16 > offset2 = offset1+containerLength newWord32 > ? the only problem is what TH can't generate INLINE pragmas, so this code can work rather slow btw, newXX operations may be better to include in the class definition: > class ByteContainer b where > new :: b > ..... -- Best regards, Bulat mailto:[email protected]