2016-12-25 7 views
1

このコードは、教科書の練習用です。GHCiで印刷関連のデフォルト警告が表示されないようにする方法

私は

minmax :: (Ord a, Show a) => [a] -> Maybe (a, a) 
minmax [] = Nothing 
minmax [x] = Just (x, x) 
minmax (x:xs) = Just (if x < xs_min then x else xs_min 
        , if x > xs_max then x else xs_max 
        ) where Just (xs_min, xs_max) = minmax xs 

を定義した場合は...その後、ghciに私はこれらのような警告が表示されます:

*...> minmax [3, 1, 4, 1, 5, 9, 2, 6] 

<interactive>:83:1: Warning: 
    Defaulting the following constraint(s) to type ‘Integer’ 
     (Num a0) arising from a use of ‘it’ at <interactive>:83:1-31 
     (Ord a0) arising from a use of ‘it’ at <interactive>:83:1-31 
     (Show a0) arising from a use of ‘print’ at <interactive>:83:1-31 
    In the first argument of ‘print’, namely ‘it’ 
    In a stmt of an interactive GHCi command: print it 
Just (1,9) 

私はminmaxの型シグネチャのコンテキストでShow aを持つことだろうと予想していましたそのような警告を排除しました。なぜこれで十分ではないのか分かりません。

このような警告を排除するために何をすべきですか? (私はminmaxによって返された値のために明示的に新しいタイプを定義する必要はありませんソリューションで特に興味)

+2

Re: "これは十分ではありません": 'Show a'は、コンパイラーが印刷方法を知っているタイプを選択することを要求しますが、多くのタイプがこの契約を満たします。通常、可能なタイプを多く持つことは問題ではありません。実際にあなたのコードを実行するには、単一の型とそれに関連する 'Show'インスタンスを選択する必要がありますので、' show'のどの実装を使用するか知っています。それは多くの選択肢を持つかもしれないと感じるので、それはあなたがあなたのために作ったものとは異なる選択をしたかったかもしれないとあなたに警告します。 –

答えて

6

数値リテラルは、ポリモーフィック型を持ち、かつので、それらのリストを実行します。

GHCi> :t 3 
3 :: Num t => t 
GHCi> :t [3, 1, 4, 1, 5, 9, 2, 6] 
[3, 1, 4, 1, 5, 9, 2, 6] :: Num t => [t] 

へ警告を取り除き、リストのタイプ(または同じものにまで沸騰する要素のタイプ)を指定します。

GHCi> minmax ([3, 1, 4, 1, 5, 9, 2, 6] :: [Integer]) 
Just (1,9) 
GHCi> minmax [3 :: Integer, 1, 4, 1, 5, 9, 2, 6] 
Just (1,9) 

がわずかに異なるシナリオを含む関連の提案のためにもExponents defaulting to Integer参照してください。そうすれば、不履行は必要ないでしょう。

関連する問題