
Donn Cave wrote:
On Wed, 10 May 2006, Donald Bruce Stewart wrote:
Funny this should come up. We've just had several submissions to work on a functional shell for the google summer of code.
Here's a bit of a summary of what's been done in Haskell I prepared a while back.
http://www.cse.unsw.edu.au/~pls/thesis-topics/functionalshell.html
My background is more shells than FP, so I'm not sure what to make of this - if we're talking about doing things for educational purposes, or serious attempts to make a viable alternative to ... something.
Here is an example of the kind of thing you could have with a pure interactive Haskell shell: newtype FileName = FileName String -- for example newtype DirName = DirName String newtype Shell a = Shell (IO a) deriving (Monad, MonadIO) ls :: Shell [FileName] cat :: FileName -> [FileName] -> Shell () -- run a command with the current directory set to DirName withDir :: DirName -> Shell a -> Shell a -- catenate all files in a specified directory catenate outputFile dir = withDir dir $ ls >>= cat outputFile Of course the above could no doubt be improved but surely it is already far easier to understand and much more powerful than the idiosyncratic text based approach used in UNIX shells (including rc). To extend the example further, with a simple function to split a filename into a name and an extension, we could rename all .txt files to .hs files with: split :: FileName -> (String, String) unsplit :: (String, String) -> FileName rename :: FileName -> FileName -> Shell () rename extFrom extTo files = do let candidates = filter (\(_,ext) -> ext==extFrom) (map split files) mapM_ (\f@(n,_) -> rename (unsplit f) (unsplit (n, extTo))) candidates % ls >>= rename "txt" "hs" So although the above may be educational, I think it would also be truly useful and practical. It would also save a lot of trouble if everything was done in Haskell instead of using all those UNIX commands, because then people would only need to learn one language to be able to do anything with their computing environment. Regards, Brian.