2016-05-30 18 views
0

ある長さのパスカルの三角形に印刷したかったのです。Haskellプログラムでインスタンスエラーが発生していない

main = do 
    l_str <- getLine 
    let l_int = read $ l_str :: Int  
    let why = print_row l_int 0 
    print why 
    return() 

print_row x y 
    | (x < y) = " "  
    | otherwise = (print_column y 0) ++ "\n" ++ print_row x (y+1) 
print_column y r 
    | (y < r) = "" 
    | otherwise = (show $ fact y r) ++ print_column y (r+1) 
fact n r 
    | (n >= r) = truncate $ (fact' n)/((fact' (n-r))*(fact' r)) 
fact' n 
    | (n >= 0) = product [1..n]  

「print_row」、「print_column」のすべての機能がすべて正常に機能していることを確認しました。 は、私はこのエラーを取得しています:私はライン4.Likeに代わりl_intの定数を使用する場合

PascalTriangle.hs:4:17:
No instance for (RealFrac Int) arising from a use of ‘fact’
In the expression: fact l_int 0
In an equation for ‘why’: why = fact l_int 0
In the expression:
do { l_str <- getLine;
let l_int = ...;
let why = fact l_int 0;
print why;
.... }

私はこのerror.Theのpogramについては何も理解できないのですが正常に動作する理由= print_row 4 0

てみましょう
+0

このようなエラーを助長する一般的な戦略は、関数に型シグネチャを追加することです。 – user2297560

+0

あなたの問題とは無関係ですが、将来は 'read <$> getLine'より' readLn'を好むかもしれません。パースエラーでは、前者は、あまりあいまいではない純粋な例外の代わりに、IO例外をすぐにスローします。 –

答えて

0

/の代わりにdivを使用する必要があります。

divは2つの積分値を取り、別の積分値を返します。 div 5 2 == 2。次に、truncateコールを取り除く必要があります。

/ "浮動小数点"除算を行います。

fromIntegralは、他のNumタイプにIntegral値を変換します。

+0

結果を別の行に出力したいので "\ n"を追加しましたが、動作しません。 –

+0

これは_新しい質問の良い候補です! – ErikR

関連する問題