良いウコーディングスタイルのif/elseコンテナの中にディレクティブ?
-
02-07-2019 - |
質問
私は学習ウの希望に貢献してくれることに接近しようとしている機能です。以前、私は主に言語を使用Cのような書式は、C、Java、D.
ちょっと質問のコーディングスタイルの if
/else
コンテナの中にディレクティブを使用する チュートリアルWikibooks.このコードは、以下に示すようになります:
doGuessing num = do
putStrLn "Enter your guess:"
guess <- getLine
if (read guess) < num
then do putStrLn "Too low!"
doGuessing num
else if (read guess) > num
then do putStrLn "Too high!"
doGuessing num
else do putStrLn "You Win!"
することに戸惑い、このコーディングスタイルに完全に違反するお勧めのスタイルのような言語がすべきインデント if
, else if
, は、 else
同じカラムです。
ただ、それだけでなウているため、構文解析エラーが発生しインデント else
同じカラムとして if
.
その一方で、以下のパッケージのコスメ。私はすでに明らかにします。ですが、上記の使用によるWikibooksいる他のウチュートリアルを、"最高のチュートリアルのオンライン"の公式ウサイトのいかはまだわかりませんが、いずれこのコーディングスタイルにセキュウです。
doGuessing num = do
putStrLn "Enter your guess:"
guess <- getLine
if (read guess) < num then
do
putStrLn "Too low!"
doGuessing num
else if (read guess) > num then do
putStrLn "Too high!"
doGuessing num
else do
putStrLn "You Win!"
なので、私の好奇心を持つことから始まるコーディングスタイルにあらかじめ組み込まれているというのはしおりを付けることがでコーディングスタイルにこの作品のコードについて教えてください。
解決
ウスタイルが機能しない欠かせ!ようこそが、"考える組み合わせ機能を記述する 何 貴社のプログラムはいません。
ゲームをプログラムは言うまでもなく両者がユーザーのためのかな。正しい推当にありがとうございますそうしないと、ユーザーしよう。ゲームまで続くのユーザーの推測が正しくで書いています:
main = untilM (isCorrect 42) (read `liftM` getLine)
この使用combinatorが繰り返し運動(getLine
引線の入 read
に変換するstringを整数値の場合)および監査員のレベルアップ結果:
untilM :: Monad m => (a -> m Bool) -> m a -> m ()
untilM p a = do
x <- a
done <- p x
if done
then return ()
else untilM p a
の述語(一部の適用 main
)をチェックしんに対する正しい値に反応すめ
isCorrect :: Int -> Int -> IO Bool
isCorrect num guess =
case compare num guess of
EQ -> putStrLn "You Win!" >> return True
LT -> putStrLn "Too high!" >> return False
GT -> putStrLn "Too low!" >> return False
ション、実行までの推測が正しくです
read `liftM` getLine
なぜなく単純な構成の性能におい
*Main> :type read . getLine <interactive>:1:7: Couldn't match expected type `a -> String' against inferred type `IO String' In the second argument of `(.)', namely `getLine' In the expression: read . getLine
の種類 getLine
は IO String
, ものの、 read
い純粋 String
.
の機能 liftM
から。Monad、純粋な機能は"リフト"でmonad.の種類の表情語につくでおすすめ:
*Main> :type read `liftM` getLine read `liftM` getLine :: (Read a) => IO a
でI/Oアクションが行える価値の変 read
, では、 Int
ます。リコール readLine
はI/Oアクション利回り String
値であり、のようなものと考えることができ liftM
ることにより、お申し込みくださ read
"内部"に IO
monad.
サンプルゲーム:
1 Too low! 100 Too high! 42 You Win!
他のヒント
ご利用中の場合は"-コンストラクトです。
doGuessing num = do
putStrLn "Enter your guess:"
guess <- getLine
case (read guess) of
g | g < num -> do
putStrLn "Too low!"
doGuessing num
g | g > num -> do
putStrLn "Too high!"
doGuessing num
otherwise -> do
putStrLn "You Win!"
軽微な改善をmattiastの場合は書い編集しながら、カルマ)の比較機能に戻すための一つの価値をいただけます様、お願い申しGT、EQ:
doGuessing num = do
putStrLn "Enter your guess:"
guess <- getLine
case (read guess) `compare` num of
LT -> do putStrLn "Too low!"
doGuessing num
GT -> do putStrLn "Too high!"
doGuessing num
EQ -> putStrLn "You Win!"
私はこのようなウ問いていただきたいと思いますをかけて投稿します。いることが多い感じが っ より表現する方法のことだけを考えているが、ウが最初に外国となっていますね。
ボーナス質問のウjournyman:どのタイプdoGuessing?
の解釈ウ if ... then ... else
以内 do
ブロックをもとにウの構文です。
しかし、多くの人を好む若干異なる書式では、許可 then
や else
が同じインデントレベルとしての対応 if
.そのため、GHCが付属し、選択言語の拡張子と呼ばれ DoAndIfThenElse
, が、この構文です。
の DoAndIfThenElse
拡張子は、核となる語学の最新の改定のウ仕様 ウ2010.
こうしてインデントの'を'および'else'内部'しない'ブロックとのバグによるものです。でも固定ウ'(ウム)の次のバージョンのウ仕様となります。
も利用できます明示的な分類が付巻きブレース.のレイアウト部 http://www.haskell.org/tutorial/patterns.html
ないことをお勧めしますが。私は誰も見たことのない利用明示的な分類のほか少数の特殊な場合に解いた。また、普段は見る 標準コードプレリュード の例です。
を使用したいのコーディングスタイルのように与えらWikibooks.確認するものではありませんのCガイドラインがウは、かなり読めるけど、特にロサンゼルス生まれさせてくれました。でもパターン後にアルゴリズムの多くの使用教科書のように、Cormen.
見えてきますので色々なインデントなスタイルウ.多くの維持なエディタに設置したデータを正います。
スタイルで表示が簡単になり、少な要求の厳しいエディタのだと思いまはそうしていくべきである。の矛盾が見えるのは入れますので、最初については独自のラインを入れますので、その他のdosの後、その次に/す。
を求め、これに耳を傾けその他のアドバイスなどを考えるコードウが棒をインデントです。