
Hello, I'm wondering if it is possible doing IO in terms of Arrow. I got a function search all files under directory recursively and I'd like to refartoring using Arrow terms. I tried to define a function like below but failed. isDirExist = Kleisli doesDirectoryExist Do I need to define a instance for IO to be Arrow? Or is there any existing solutions? I'm a newbie of Haskell and thanks your help. ~~~~~ getFilesInDir :: FilePath -> IO [FilePath] getFilesInDir inp = do isDir <- doesDirectoryExist inp files <- if isDir then (do names <- getDirectoryContents inp forM [ inp > x | x <- names, isNotSpecialDir x ] getFilesInDir) else return [[inp]] return $ concat files ~~~~~

Haisheng Wu
I'm wondering if it is possible doing IO in terms of Arrow. I got a function search all files under directory recursively and I'd like to refartoring using Arrow terms.
Yes, it's possible using Kleisli, but it's not very convenient, because you need the Kleisli wrapper around everything. Also usually there is really little reason to do that, because monads are more expressive. For example they allow you to encode computations with only outputs directly, without wrapping them in a computation, which takes a stub argument.
I tried to define a function like below but failed. isDirExist = Kleisli doesDirectoryExist
Do I need to define a instance for IO to be Arrow? Or is there any existing solutions?
No, the needed instances are already there, but you need to change your type signatures: myGetFilesInDir :: Kleisli FilePath [FilePath] Greets, Ertugrul -- nightmare = unsafePerformIO (getWrongWife >>= sex) http://ertes.de/

You find point I need the correct type signatures.
And seems like it is (missed IO in your description)
Kleisli IO FilePath [FilePath]
Thanks a lot!
-Haisheng
On Tue, Jun 28, 2011 at 12:38 AM, Ertugrul Soeylemez
Haisheng Wu
wrote: I'm wondering if it is possible doing IO in terms of Arrow. I got a function search all files under directory recursively and I'd like to refartoring using Arrow terms.
Yes, it's possible using Kleisli, but it's not very convenient, because you need the Kleisli wrapper around everything. Also usually there is really little reason to do that, because monads are more expressive. For example they allow you to encode computations with only outputs directly, without wrapping them in a computation, which takes a stub argument.
I tried to define a function like below but failed. isDirExist = Kleisli doesDirectoryExist
Do I need to define a instance for IO to be Arrow? Or is there any existing solutions?
No, the needed instances are already there, but you need to change your type signatures:
myGetFilesInDir :: Kleisli FilePath [FilePath]
Greets, Ertugrul
-- nightmare = unsafePerformIO (getWrongWife >>= sex) http://ertes.de/
_______________________________________________ Beginners mailing list Beginners@haskell.org http://www.haskell.org/mailman/listinfo/beginners
participants (2)
-
Ertugrul Soeylemez
-
Haisheng Wu