2016-09-18 6 views
0

Idone.comサイトを使用していますが、このコードを実行したいが、putStrLn構文を知らないstdinからコンパイルするこのコードを使用しますが、stripエラーです。putStrLnを使用して結果を表示

main = putStrLn (show (sumaCifras x)) 
sumaCifras:: Int -> Int 
sumaCifras x = div x 1000 + mod (div x 100) 10 + mod (div x 10) 10 + mod x 10 

答えて

4

このスコープにバインドされていないmain関数でxを使用するため、コンパイラに問題があります。まず、入力から値を読み取り、それを関数に渡す必要があります。あなたは2つの方法でそれを行うことができます。あなたはintとしてxを使用したい場合は、あなたが機能を「読み」を使用する必要があり

main = do 
     x <- getLine 
     putStrLn (show (sumaCifras (read x :: Int))) 

:言語を命令型に使用される人々のための

より自然は、それがそのようになります。ここでの構文を、「やる」ですコンパイラは何を期待するかを知るでしょう。

より機能的な方法でそれを書くために、あなたは「>> =」演算子はそれがここで(最初のモナドアクションから結果値を取得すること

main = getLine >>= (\x -> putStrLn(show (sumaCifras (read x :: Int))) 

のようにそれを渡すために、モナド変換を使用することができます入力を取得するIOアクション)を右の関数に適用します(ここでは、入力をIntegerとして読み込み、関数を適用してputStrLnに返し、画面に出力します)。 "do"構文は本質的に単なるモナド演算の構文的砂糖なので、プログラムの実行やパフォーマンスには影響しません。

あなたはそれを書くことで、機能的にそれを書面でさらに一歩行くことができ、完全にポイントフリー

main = getLine >>= (putStrLn . show . sumaCifras . (read :: String -> Int)) 

ので、ここであなたは、読み取り機能のためではなく、引数にこの機能を適用するための型シグネチャを持っていることに注意してください、 String - > Int。ここで最初に実行されるのは、getLine関数です。それから得られた入力は、読み込みに渡され、そこでIntにキャストされます。次にsumaCifrasが表示され、putStrLnで文字列にキャストされます。

+0

は、私はあなたが私を与えたガイドラインに従ってidone.comにこのコードを実行しようとしたが prog.hsというエラーを引っ張る:5:18:入力に誤りを解析 '=」 メイン=行う X < - のgetline putStrLn(show(sumaCifras(read x :: Int))) sumaCifras :: Int - > Int sumaCifras x = div x 1000 + mod(div x 100)10 + mod(div x 10)10 + mod x 10 –

+0

これはインデントの問題である可能性があります。インデント付きの完全なコードを貼り付けることができますか?あなたの例では、sumaCifrasの定義をインデントしていますが、インデントしてはいけません。また、sumaCifrasの方程式に角括弧を追加することもできます。現行の形式では結果が得られない可能性があります。 – Antisthenes

+0

この関数の2つの引数を読み込むにはどうすればいいですか:: Float - > Float - > Float g n t = 2 - (7 /(5 ** n * t)) このメインでは? –

関連する問題