2016-10-31 19 views
4

私はGHCiの中:t 4を入力すると、私はghciはなぜ(Ord a)=> aではない:t 4に対して(Num a)=> aを出力するのですか?

Prelude> :t 4 
4 :: Num t => t 

を取得4がintまたは整数だけではない、それはボトムアップinferedされているが、4Ord t => tかのように示されていない理由を私は理解していないことを、なぜ私は理解してこのような、より正確なもの:

4 :: (Ord t || Num t) => t 

4OrdNumが、OrdNum接続されていないの両方であるので...

なぜ:t 4出力はNumになるのですか?

+0

これは[haskell report](https://www.haskell.org/onlinereport/haskell2010/haskellch6.html#x13-1360006.4.1)に記載されています – Lee

+4

「4」に「Ord t = > tである。今、私は 'Bool'が' Ord'のインスタンスであることに注目します。したがって、 '4 :: Bool'。 '4 :: Bool'を' True'または 'False'にする必要があります。なぜですか? –

+0

@Lee Btw、タイプのデフォルトルールに関する似たような質問があります:https://stackoverflow.com/questions/39251728/ghci-randomio-type-in​​ference私はそれに答えることを試み、レポートを理解しましたが、まだ明確な見解はありません。たぶん経験豊富な_Haskell_ユーザーが助けることができるでしょう:) – Shersh

答えて

9

ないNumためのインスタンスを持つすべてのタイプにもOrdのインスタンスを持っており、あなただけのHaskellは持ってオーバーロードされた数値リテラルを持つようにNumfromInteger一部を必要としています。例えば、ComplexからData.Complexまでは、Numインスタンスを持ちますが、Ordはありません。この場合、4は、ではなく、であり、Ordである。

ghci> import Data.Complex 
ghci> let x = 1 :: Complex Double 
ghci> let y = 2 :: Complex Double 
ghci> x < y 
<interactive> 
    * No instance for (Ord (complex Double)) arising from use of `<' 
    * In the expression: x < y 
     In the equation for `it': it = x < y 
ghci> 

@Leeがコメントしたように、これはreportで概説挙動です。

+0

なぜ型が '(Ord t、Num t)=> t'ではないのか説明しました。なぜそうではないのですか?(Ord t || Num t)=> (これは有効な構文ではありませんが、 "Ord' *または* a'Num'であると言うことになります) – sepp2k

+0

@ sepp2kそれは本当です - 私は'私は間接的にこれに答えると思います... – Alec

+0

Ok thx。@Leeによって提供されたLinkのfromIntegralというものはとても役に立ちました。 .3](https://www.haskell.org/onlinereport/haskell2010/haskellch4.html#x10-790004.3.4)。したがって、 '(3 <4)'と書くと、実際の '4'型を推論することができますコンパイラは 'Int'、' Integer'、 'Float'、' Double'(あるいはさらに外部モジュールを使用する)のいずれかである '(Num t、Ord t)=> t'を満たす型を見つけなければなりません。それはあいまいであり、エラーを生成します。しかし、Numについては、これらのあいまいさはdefaulによって解決されます(この場合は)整数に変換します。 – Databyte

関連する問題