2017-09-13 5 views
6

は、私は、多型のタイプを参照してください。タイプデフォルトルールが適用されたghciのポリモフィック関数(または値)のタイプを出力するにはどうすればよいですか?私はGHCiの中<code>:t</code>コマンドを入力すると

ghci> :t 42 
42 :: Num t => t 
ghci> :t div 
div :: Integral a => a -> a -> a 

をしかし、私は実際にそのような機能を評価した後、私はタイプ不履行ルールの結果を参照してください。 ghciでHaskellのレポートやghcの実装に従ってタイプ違反のルールを適用した後に、タイプがどのように変更されるかを観察するコマンドや能力がありますか?

+0

タイプデフォルトルールの結果はどのように表示されますか? ':t 42 \' div \ '2'は' Integral a => a'を示し、let-bindingsなどの結果も同様です。 –

+0

@ n.m。私は実際の結果について言っていました。 '2^100 \' div \ '2'は '633825300114114700748351602688'を出力します。この場合のデフォルトの型は' Integer'です。 'ghci'でこの定数の型が多型であると言われても、実際にはその固有値と、どの単形型が使われているのかを見たいと思います。 – Shersh

+1

@ShershそれはちょうどGHCiです。 REPLは何かを表示しなければならないので、型(この場合は 'Integer')を選択します。 "本当の"コードでは、コンテキストが型を選ぶまでは多態的です。 –

答えて

5

あなたが新しい名前にバインドその後、単相性制限をオンにすると、これを行うことができます:あなたは、常に新しい変数を定義する必要性を空想しない場合は、この問題を回避

Prelude> :set -XMonomorphismRestriction 
Prelude> let n = 42 
Prelude> :t n 
n :: Integer 
Prelude> let p = (^) 
Prelude> :t p 
p :: Integer -> Integer -> Integer 
Prelude> let e = (**) 
Prelude> :t e 
e :: Double -> Double -> Double 
Prelude> let d = div 
Prelude> :t d 
d :: Integer -> Integer -> Integer 

得ることができます

Prelude> :def monotype (\e -> return $ ":set -XMonomorphismRestriction\nlet defaulted = "++e++"\n:t defaulted") 

(あなたが常に利用可能なコマンドを持っているあなたの.ghciファイルにそれを置きたい場合があります)、その後

Prelude> :monotype (^) 
defaulted :: Integer -> Integer -> Integer 
を使用して、もちろん

、単相性制限を有効にするの隠された世界的な副作用は非常に醜いですが、まあ...

+0

私のための 'div'(8.0.2)ではうまくいきます。おそらく ':t d'と尋ねます:) –

+0

ええ、8.3と7.10では':t div'の代わりに ':t d'を書くときにもうまくいきます。私の指があまりにも速くそこに打ち込んだ... – leftaroundabout

+0

それは本当に役に立つ!完璧ではない(私は ':t div'と書くことができないので)しかし既に十分です。 – Shersh

4

ない完璧なソリューション、それが最初のステップである可能性があります。タイプa(a,TypeRep)に変更されますから、GHCiのは、そのすべての不履行の魔法を使用することはありません、

> import Data.Typeable 
> let withType x = (x, typeOf x) 
> withType [] 
([],[()]) 
> withType 56 
(56,Integer) 

注意。それでも、その一部を示すことができます。

GHCiの:set +tオプションも興味深いですが、GHCiのデフォルト設定の前に多態型を出力します。

+0

これは興味深い解決策です! – Shersh

関連する問題