こんにちは。早川です。
nobsun さん、ありがとうございます。

On Fri, 18 Apr 2003 13:54:17 +0900 (JST)
Nobuo Yamashita <nobsun / sampou.org> wrote:
> 2つに分るだけなら早川さんの split' とほぼ同じで、
> 
> \begin{code}
> 
> dividWhere :: (a -> Bool) -> [a] -> ([a],[a])
> dividWhere p xs = case break p of 
> 		    (_,[])    -> (xs,[])
> 		    (ys,_:zs) -> (ys,zs)
> 
> \end{begin}
> 
> てな感じで、区切り子の表現を述語関数にしておくと汎用性があるかも。。。

なるほど。
case を使うとすっきり書けるんですねー

> CSV とかをハンドリングするとき引用符などにも対応できるように
> 以下のようなのを定義して、よくつかっています。ちょっと繁雑ですが。
> 
> \begin{code}
> 
> dividWithQuoteBy :: [(Char,Char)] -> (Char -> Bool) -> String -> [String]
> dividWithQuoteBy _ _ "" = [""]
> dividWithQuoteBy qs p ccs@(c:cs)
>  = if p c
>      then "" : dividWithQuoteBy qs p cs
>      else case break (pOR p q) ccs of
>             (_,[]) -> [ccs]
>             (xs,yys@(y:ys)) 
>               -> case lookup y qs of
>                    Nothing -> xs : dividWithQuoteBy qs p ys
>                    Just eq 
>                      -> case break (eq ==) ys of
>                           (_,[])   -> error ("Invalid format: no "++show eq)
>                           (zs,w:ws)-> case dividWithQuoteBy qs p ws of
>                                         []     -> [ccs]
>                                         ts:uus -> (xs++[y]++zs++[w]++ts) : uus
>    where q x = case lookup x qs of {Nothing -> False; _-> True}
> 
> \end{code}

これ、とても参考になります!
lookup を使う時も case で受けるとすっきりしたコードになるんですね。
Maybe や Either を返す関数は、case で受けとるのが
イディオムみたいなものでしょうか。

ところで pOR が定義されていない、とエラーが出てしまうのですが
これは標準の関数ではないですよね??

こんな↓感じでよいでしょうか。

pOR p q = \x -> p x || q x


--
SH
tetryl / tokyoprogrammer.com


--
ML: haskell-jp / quickml.com
使い方: http://QuickML.com/