良いウコーディングスタイルのif/elseコンテナの中にディレクティブ?

StackOverflow https://stackoverflow.com/questions/127190

  •  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

の種類 getLineIO 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 ブロックをもとにウの構文です。

しかし、多くの人を好む若干異なる書式では、許可 thenelse が同じインデントレベルとしての対応 if.そのため、GHCが付属し、選択言語の拡張子と呼ばれ DoAndIfThenElse, が、この構文です。

DoAndIfThenElse 拡張子は、核となる語学の最新の改定のウ仕様 ウ2010.

こうしてインデントの'を'および'else'内部'しない'ブロックとのバグによるものです。でも固定ウ'(ウム)の次のバージョンのウ仕様となります。

も利用できます明示的な分類が付巻きブレース.のレイアウト部 http://www.haskell.org/tutorial/patterns.html

ないことをお勧めしますが。私は誰も見たことのない利用明示的な分類のほか少数の特殊な場合に解いた。また、普段は見る 標準コードプレリュード の例です。

を使用したいのコーディングスタイルのように与えらWikibooks.確認するものではありませんのCガイドラインがウは、かなり読めるけど、特にロサンゼルス生まれさせてくれました。でもパターン後にアルゴリズムの多くの使用教科書のように、Cormen.

見えてきますので色々なインデントなスタイルウ.多くの維持なエディタに設置したデータを正います。

スタイルで表示が簡単になり、少な要求の厳しいエディタのだと思いまはそうしていくべきである。の矛盾が見えるのは入れますので、最初については独自のラインを入れますので、その他のdosの後、その次に/す。

を求め、これに耳を傾けその他のアドバイスなどを考えるコードウが棒をインデントです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top