16

したがって、2つのパラメーターを受け取る非常に単純な関数があります。1つ目は1時間(0から23の間)で、2つ目は1分(0から59の間)です。この関数は、時間と1分を返し、時間を美しいスタイルにフォーマットします。例として、をhour 11 12返し11 heures et 13 minutesます。時間のフランス語形式でごめんなさい。

したがって、この関数ではshow関数を使用し、パラメーターは数値である必要があるため、型宣言があり(Num a, Show a) => a -> a -> Stringます。しかし、この関数を試してみると、エラーが発生し、GHCから型制約を追加するように言われましたが、この場合Eqに型制約が必要な理由がわかりませんEq。コードがあります(関数で使用されているフランス語のテキストについては申し訳ありませんが、関数の名前とテキストがわからなくてもそれほど重要ではないと思います):

heure :: (Num a, Eq a, Show a) => a -> a -> String
heure 23 59 = "Minuit"
heure 12 m  = "Midi et " ++ show (m+1) ++ " minutes"
heure h 59  = show (h+1) ++ " heures"
heure h m   = show h ++ " heures et " ++ show (m+1) ++ " minutes"

だから:私が使用しない場合Eq、私はエラーがあり、それを使用すると私のコードは正しいです。なんで?

説明ありがとうございます!

4

1 に答える 1

22

に等しいかどうか、およびに等しいかEqどうかをチェックしているため、制約が必要です。ではなくパターンマッチングを使用して実行していますが、数値リテラルに対するパターンマッチングでは、(コンストラクターに対するパターンマッチングとは異なり)それでも必要です。h2312m59==Eq

于 2013-03-19T23:41:40.980 に答える