haskellで簡易lsを作る

苦労の末に

Prelude System.Directory> getDirectoryContents "/" >>= return.concatMap (++" ") >>= putStrLn
bin lib sbin sys selinux vmlinuz . root boot usr srv cdrom vmlinuz.old initrd.img var tmp dev media opt proc mnt initrd.img.old home lost+found etc ..

やっと、 >>= とreturnの意味がわかったような気がする。

 g >>= \x -> return f x

 g >>= return.f 

でいいのか。合成関数の使いどころってすごいな。あれ?こいつをdoで書くとどうなるんだろう。

$ runghc -e 'import System.Directory; main=getDirectoryContents "/" >>= return.(concatMap (++" ")).filter (`notElem` [".",".."]) >>= putStrLn'
bin lib sbin sys selinux vmlinuz root boot usr srv cdrom vmlinuz.old initrd.img var tmp dev media opt proc mnt initrd.img.old home lost+found etc

doでかきなおすと

$ runghc -e 'import System.Directory; main=do{ d<-do{g<-getDirectoryContents "/"; (return.(concatMap (++" ")).filter (`notElem` [".",".."])) g} ; putStrLn d}'
bin lib sbin sys selinux vmlinuz root boot usr srv cdrom vmlinuz.old initrd.img var tmp dev media opt proc mnt initrd.img.old home lost+found etc

 d<-モナド; モナドを扱う関数 d ってことか。λ式の別表記方法なんだな。