nobsun です。

> 文字列をある文字で区切って pair を返す以下のような関数を
> 考えてみました。
> 
>     split' :: Eq a => a -> [a] -> ([a], [a])
>     split' c xs = let (ys, zs) = break (c ==) xs
>         in (ys, tail zs)
> 
>     -- split' '@' "foo / bar.com" = ("foo","bar.com")
> 
> 既にあるかと思って探したのですが見つかりませんでした。
> 標準ではこのような関数は存在しないでしょうか。
> あるいは、より良い方法がありましたらお教え願います。

標準ライブラリではありませんねぇ。

2つに分るだけなら早川さんの split' とほぼ同じで、

\begin{code}

dividWhere :: (a -> Bool) -> [a] -> ([a],[a])
dividWhere p xs = case break p of 
		    (_,[])    -> (xs,[])
		    (ys,_:zs) -> (ys,zs)

\end{begin}

てな感じで、区切り子の表現を述語関数にしておくと汎用性があるかも。。。

3つ以上の部分にわける例は、Prelude 関数の lines や words があります。
lines は '\n' で分けていますし、words は白空白で分けています。

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}

たとえば、

words は dividWithQuoteBy [] isSpace
lines は dividWithQuoteBy [] ('\n'==)

ですし、

\begin{code}

wordsWithQuote = dividWithQuoteBy [('\"','\"')] isSpace 

\end{code}

とか定義しておくと

wordsWithQuote "He said \"Hello, world!\""

  --> ["He","said","\"Hello, world!\""]

てな感じです。

CSV のラインデータを処理するときには

\begin{code}

readCSVLine :: String -> [String]
readCSVLine = dividWithQuoteBy [('\"','\"'),('\'','\'')] (','==)

\end{code}

てな感じでどうでしょう。

--
Nobuo Yamashita                 mailto:nobsun / sampou.org
  I love programming.           http://www.sampou.org/
  I love pencil puzzles.        http://www.puzzle.jp/





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