
Excerpts from Stephen Tetley's message of Sat Jan 16 10:27:33 +0200 2010:
If you haven't obviously got dispatch on type then records are certainly fine.
Yes, no dispatch on type. I got a class based implementation compiling, but it seems overly complex. Maybe the record approach is better after all. This is a bit more complex than Parsec unfortunately. (an analogue would be adding encodings to the types of Parsec parsers) import Data.Word data IsDir data IsFile type Ino = Word32 data Attr = Attr {} data Proxy t type family FT (fht :: ((* -> *) -> *)) (fd :: *) class FH (t :: (* -> *) -> *) where fhFre :: Proxy t -> Word64 -> IO () fhAllo :: forall any. FT t any -> IO Word64 fhRe :: forall any. Word64 -> IO (FT t any) data UseRaw :: ((* -> *) -> *) type instance FT UseRaw any = Word64 instance FH UseRaw where fhFre _ _ = return () fhAllo = return fhRe = return data UseStablePtr :: (* -> *) -> (* -> *) -> * type instance FT (UseStablePtr ty) fh = ty fh instance FH (UseStablePtr ty) where -- omitted class FH (FhImpl ty) => Fuse' ty where type FhImpl ty :: (* -> *) -> * open' :: ty -> Ino -> IO (FT (FhImpl ty) IsFile) read' :: ty -> Ino -> FT (FhImpl ty) IsFile -> Word64 -> Word32 -> IO [Word8] opendir' :: ty -> Ino -> IO (FT (FhImpl ty) IsDir) getattr' :: forall fileOrDir. ty -> Ino -> FT (FhImpl ty) fileOrDir -> IO Attr data MyUserType = MyUserType instance Fuse' MyUserType where type FhImpl MyUserType = UseRaw open' = \_ _ -> return 22 - Taru Karttunen