7

私は Haskell にかなり慣れていないので、C ライブラリを処理する関数に複数の IO 汚染値を渡す方法を見つけようとしています。ほとんどの人は、次のように do ブロック内で <- 演算子を使用しているようです。

g x y = x ++ y
interactiveConcat1 = do {x <- getLine;
                         y <- getLine;
                         putStrLn (g x y);
                         return ()}

これは、emacs が自動インデントできないことを除けば、C をやっているような気分にさせてくれます。私はこれをもっと Lisp スタイルで書こうとしました:

interactiveConcat2 = getLine >>= (\x ->
                     getLine >>= (\y ->
                     putStrLn (g x y) >>
                     return () ))

これはごちゃごちゃしているように見え、最後に数えなければならない一連の閉じ括弧があります (ただし、emacs は Lisp ではこのタスクを確実に支援できますが、Haskell では支援できません)。さらに別の言い方は、

import Control.Applicative
interactiveConcat3 = return g <*> getLine <*> getLine >>= putStrLn

これはきれいに見えますが、基本言語の一部ではありません。

IO 汚染ボックスから値を剥がすための、より簡単な表記法はありますか? おそらく、リフト*またはfmapを使用したよりクリーンな方法はありますか? 「慣用的」と見なされるものを尋ねるのが主観的すぎないことを願っていますか?

また、emacs を (Haskell Ind) モードよりもうまく連携させるためのヒントをいただければ幸いです。ありがとう!

ジョン

編集: https://wiki.haskell.org/Do_notation_considered_harmfulに出くわし、私が書いたラムダ チェーンのネストされた括弧は必要ないことに気付きました。しかし、コミュニティ (および ghc の実装者) は、 <*> などを使用して Applicative にインスパイアされたスタイルを採用しているようです。これにより、演算子の優先順位を理解するという頭痛の種にもかかわらず、コードが読みやすくなっているようです。

4

2 に答える 2