2

二次方程式を持つ解の数を教えてくれる簡単なプログラムを書かなければなりません。私が書いた:

howManySolutions :: Float -> Float -> Float -> Int

howManySolutions a b c = if (b^2-(4*a*c)) > 0 then 2 else 
                         if (b^2-(4*a*c)) == 0 then 1
                         else -1

しかし、WinHugs では構文エラーが発生します。

  unexpected ´;' possibly due to bad layout

プログラムを GHCi で開くことはできますが、負の数を使用することはできません...何が間違っているのでしょうか?

4

3 に答える 3

7

winhugs の問題についてはよくわかりませんが、ghci の問題についてはお手伝いできます。

まず、少しインデントします。

howManySolutions a b c = if (b^2-(4*a*c)) > 0
                         then 2
                         else 
                           if (b^2-(4*a*c)) == 0
                           then 1
                           else -1

ここで、howManySolutions -1 2 3ghci に入ろうとすると、 No instance for (Num (Float -> Float -> Float -> Int)) arising from a use of '-'. 基本的に、「-」を「1」に適用するのではなく、1 2 および 3 に適用する関数として解釈しています。

として入力するだけhowManySolutions (-1) 2 3です。

さて、ヒントをあげることができれば、このようなパターンは通常次のように処理されます。

howManySolutions a b c
  | delta > 0 = 2
  | delta == 0 = 1
  | otherwise = -1
  where delta = b^2-4*a*c 

'|' シンボル (ガード) は異なる「if」として機能し、下部の「where」句を使用すると、デルタを 1 回定義して、ガードで複数回再利用できます。それはもっときれいです:D

于 2013-11-05T21:49:46.270 に答える
0

を使用-1することは、Haskell にとっては悪い考えです。Maybe a代わりに、次のように使用できます。

howManySolutions :: Float -> Float -> Float -> Maybe Int
howManySolutions a b c = let delta = b^2-(4*a*c) in
             if delta > 0 
             then Just 2 
             else if delta == 0 
                  then Just 1
                  else Nothing
于 2013-11-06T11:11:50.823 に答える