2017-05-30 9 views
0

免責事項:私はhaskellの新しいnewbですが、私は答えを見つけることができません。たぶん私は間違った方法で検索しているのでしょうか、それともとても基本的なので、誰もそれを聞かないでしょう。ここでPrintfのテキストとメソッド呼び出しの戻り値

は私がやろうものです:

import Text.Printf 
factorial n = if n < 2 then 1 else n * factorial (n-1) 

main = do 
    let input = 22 
    printf "Some text... %d! = %d" input (factorial input) 

しかし、それは動作しません、エラーの束が表示されます。あなたは私に間違ったことをしているかのような速やかなヒントを教えてもらえますか?

+1

コンパイラは 'input'の型を推論することができません。なぜなら、' No instance for ... 'のような多くのエラーがあるからです。 – freestyle

+0

"一群のエラーが出ます" - 避けてください実際のエラーを報告することなく投稿することができます。さらに、 'printf'はHaskellではあまり頻繁に使われていません - 特殊な書式が必要な場合にのみ使用してください。さもなければ、単にputStrLn( "x =" ++ show x ++ "、y =" ++ show y ")のような簡単なものを使用してください。 – chi

答えて

1

問題は、コンパイラがinputの種類を推測することができないということです。行うには、明示的にそれを提供する必要があるでしょう:

import Text.Printf 
factorial n = if n < 2 then 1 else n * factorial (n-1) 

main = do 
    let input = 22 :: Integer 
    printf "Some text... %d! = %d" input (factorial input) 

Integerことは、非常に大規模な結果のために働くwilll Intは、Haskell Wikibookを引用しません一方:

「整数」任意精度でありますタイプ:それはあなたのマシンのメモリの限界まで、どれくらいの大きさでもいい番号を保持しません... ... つまり、算術オーバーフローは発生しません。 一方、算術は比較的遅いので、 を意味します。 Lispユーザーは 「bignum」タイプをここで認識します。

"Int"は、より一般的な32または64ビットの整数です。インプリメンテーションは、少なくとも30ビットであることが保証されていますが、 です。

2

唯一のinputはあなたのコードで曖昧なタイプです。

import   Text.Printf 
factorial n = if n < 2 then 1 else n * factorial (n-1) 

main = do 
    let input = 22::Integer 
    printf "Some text... %d! = %d" input (factorial input) 
    return() 
+0

あなたよりもうまくいきました。しかし、今はint型で、最大サイズは限られています。私がこれを行うと、print(factorial 22)の代わりに、int max sizeの代わりに正しい値を示すので、intではないようです。何か案が? – jdstaerk

+0

私のせいです。それは ':: Integer'であるべきです – palik

+0

ああ大丈夫、ありがとう! – jdstaerk

関連する問題