4

関数 fromIntegral を使用したときの GHCi での次の動作について、誰かが説明してくれることを期待していました。

Prelude> let x = 1 :: Integer                                                                                                                                                    
Prelude> :t x                                                                                                                                                                    
x :: Integer                                                                                                                                                                     
Prelude> sqrt $ fromIntegral x                                                                                                                                                   
1.0                                                                                                                                                                              
Prelude> let y = fromIntegral x                                                                                                                                                  
Prelude> sqrt y                                                                                                                                                                  

<interactive>:181:1:                                                                                                                                                             
No instance for (Floating Integer)                                                                                                                                           
  arising from a use of `sqrt'                                                                                                                                               
Possible fix: add an instance declaration for (Floating Integer)                                                                                                             
In the expression: sqrt y                                                                                                                                                    
In an equation for `it': it = sqrt y                                                                                                                                         

y設定してから取得するsqrtか、直接取得するかが問題になるのはなぜsqrtですか?

4

1 に答える 1

9

fromIntegral戻り値の型が多態的です。したがって、yコード内の の型は であると予想できますNum a => a。このタイプは、問題なくyへの引数として使用できますsqrt

ただし、モノモーフィズムの制限により、 の型をyポリモーフィックにすることはできません。したがって、デフォルトの Num タイプにデフォルト設定されますInteger

これを行うとsqrt $ fromIntegral x、モノモーフィズムの制限は適用されません。これは、グローバル変数にのみ適用されfromIntegral、今回は変数に結果を格納しないためです。

この問題は、型シグネチャを y ( let y :: Num a => a; y = fromIntegal x) に追加するか、モノモーフィズムの制限を無効にすることで修正できます。

于 2012-07-11T18:43:35.563 に答える