関数のこの署名が機能しないのはなぜですか?

キャラナ
function :: (Floating a, RealFrac a, Integral b) => a -> b
function x = floor (sqrt x)

さて、この関数を見ると、型クラスと型クラスのa両方にRealFracなりFloating、次にbである指定しましIntegralこれはの署名であるfloorsqrt

floor :: (Integral b, RealFrac a) => a -> b 
sqrt :: Floating a => a -> a

ように見ることができるsqrt唯一のとりFloating秒とfloorだけ取りますRealFrac私はセットaRealFracしてFloatingそれから私はそれb私たちにを与えるIntegralのでそうなるだろうと指定しましfloorIntegral

だから私の質問は

newfunction :: (Integral a, RealFrac a, Integral b) => a -> b 
newfunction a = floor (sqrt (fromIntegral a))

なぜこれが機能しないのですか?

実際の正しいタイプの署名は

newfunction :: (Integral a, Integral b) => a -> b 
エリック・カプルン

なぜこれが機能しないのですか?

...しかし、それはします:

Prelude> :{
Prelude| let newfunction :: (Integral a, RealFrac a, Integral b) => a -> b
Prelude|     newfunction a = floor (sqrt (fromIntegral a))
Prelude| :}
Prelude> :t newfunction 
newfunction :: (Integral a, Integral b, RealFrac a) => a -> b

GHCに型シグネチャを自動的に推測させると、よりシンプルで優れたシグネチャが作成されます。

Prelude> let newfunction a = floor (sqrt (fromIntegral a))
Prelude> :t newfunction 
newfunction :: (Integral b, Integral a) => a -> b

しかし、それは手動で指定されたものが間違っていることを意味するものではありません。状況に応じて、それが求めているものである場合とそうでない場合があります。

何かがより一般的であるとはどういう意味かというと、それは仮定を少なくし、入力に課す要件/制約を少なくするときです。必要なものが少なくなることで、さまざまな入力を処理できます。これ「より一般的」と呼ばれます。


また、この場合のあまり一般的でないバージョンは、実際には何も呼び出せないため無効ですが、Haskellではそのような関数を定義できます。失敗は呼び出しサイトで発生します。

Prelude> :i RealFrac
class (Real a, Fractional a) => RealFrac a where
    ...
    -- Defined in ‘GHC.Real’
instance RealFrac Float -- Defined in ‘GHC.Float’
instance RealFrac Double -- Defined in ‘GHC.Float’

Prelude> :i Integral
class (Real a, Enum a) => Integral a where
    ...
    -- Defined in ‘GHC.Real’
instance Integral Word -- Defined in ‘GHC.Real’
instance Integral Integer -- Defined in ‘GHC.Real’
instance Integral Int -- Defined in ‘GHC.Real’

-シングルタイプは両方に属しているか見ないRealFracIntegral同時に?手動で定義した場合は機能しますinstance RealFrac Integer where ...が、それはおそらく意味がなく、一部の型クラスの法則に違反する可能性があり、したがって一貫性のない/バグのあるコードにつながる可能性があります。

したがって、一般的なガイドラインとして、 GHCで推測される型の署名から始めてから、制約を追加するか、署名をより単形/多形にしないでください。


さらに、これらの関数をポイントフリー定義することもできます。これにより、読みやすくなると思います。現在の括弧付きバージョンをポイントフリーバージョン(暗黙とも呼ばれるに変換する方法を以下に示します

function x = floor (sqrt x)
function x = floor . sqrt $ x
function   = floor . sqrt

newfunction a = floor (sqrt (fromIntegral a))
newfunction a = floor . sqrt . fromIntegral $ a
newfunction   = floor . sqrt . fromIntegral

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

この単純な関数が機能しないのはなぜですか?

分類Dev

type()関数がここで機能しないのはなぜですか?

分類Dev

この.slideToggle関数がjQueryで機能しないのはなぜですか?

分類Dev

このExcelRIGHT関数が機能しないのはなぜですか?

分類Dev

このsetAttribute関数が機能しないのはなぜですか?

分類Dev

このbash関数が機能しないのはなぜですか?

分類Dev

この関数がrunghcで機能するのに、ghciでは機能しないのはなぜですか?

分類Dev

この関数が min で機能するのに、機能しないのはなぜですか?

分類Dev

toFixed()関数が機能しないのはなぜですか?

分類Dev

JavaScript関数が機能しないのはなぜですか?

分類Dev

IfNull()関数が機能しないのはなぜですか?

分類Dev

replace()関数が機能しないのはなぜですか?

分類Dev

DeleteNode()関数が機能しないのはなぜですか?

分類Dev

IF関数が機能しないのはなぜですか?

分類Dev

%d関数が機能しないのはなぜですか?

分類Dev

click()関数が機能しないのはなぜですか?

分類Dev

関数strcatが機能しないのはなぜですか?

分類Dev

onLocationChanged関数が機能しないのはなぜですか?

分類Dev

関数が機能しないのはなぜですか?

分類Dev

javascript関数が機能しないのはなぜですか?

分類Dev

transposeMatrix関数が機能しないのはなぜですか?

分類Dev

このIF関数で、Asterix(*)は機能するのに、AND関数は機能しないのはなぜですか?

分類Dev

この加算関数がPHPで機能しないことがあるのはなぜですか?

分類Dev

このActiveRecordの関係が機能しないのはなぜですか?

分類Dev

平均関数がave関数で機能しないのはなぜですか

分類Dev

.join()が関数の引数で機能しないのはなぜですか?

分類Dev

[]のオーバーロード関数がここで機能しないのはなぜですか?

分類Dev

この単純なpostgresql関数呼び出しが機能しないのはなぜですか?

分類Dev

この関数がパイプ変数で機能しないのはなぜですか?

Related 関連記事

  1. 1

    この単純な関数が機能しないのはなぜですか?

  2. 2

    type()関数がここで機能しないのはなぜですか?

  3. 3

    この.slideToggle関数がjQueryで機能しないのはなぜですか?

  4. 4

    このExcelRIGHT関数が機能しないのはなぜですか?

  5. 5

    このsetAttribute関数が機能しないのはなぜですか?

  6. 6

    このbash関数が機能しないのはなぜですか?

  7. 7

    この関数がrunghcで機能するのに、ghciでは機能しないのはなぜですか?

  8. 8

    この関数が min で機能するのに、機能しないのはなぜですか?

  9. 9

    toFixed()関数が機能しないのはなぜですか?

  10. 10

    JavaScript関数が機能しないのはなぜですか?

  11. 11

    IfNull()関数が機能しないのはなぜですか?

  12. 12

    replace()関数が機能しないのはなぜですか?

  13. 13

    DeleteNode()関数が機能しないのはなぜですか?

  14. 14

    IF関数が機能しないのはなぜですか?

  15. 15

    %d関数が機能しないのはなぜですか?

  16. 16

    click()関数が機能しないのはなぜですか?

  17. 17

    関数strcatが機能しないのはなぜですか?

  18. 18

    onLocationChanged関数が機能しないのはなぜですか?

  19. 19

    関数が機能しないのはなぜですか?

  20. 20

    javascript関数が機能しないのはなぜですか?

  21. 21

    transposeMatrix関数が機能しないのはなぜですか?

  22. 22

    このIF関数で、Asterix(*)は機能するのに、AND関数は機能しないのはなぜですか?

  23. 23

    この加算関数がPHPで機能しないことがあるのはなぜですか?

  24. 24

    このActiveRecordの関係が機能しないのはなぜですか?

  25. 25

    平均関数がave関数で機能しないのはなぜですか

  26. 26

    .join()が関数の引数で機能しないのはなぜですか?

  27. 27

    []のオーバーロード関数がここで機能しないのはなぜですか?

  28. 28

    この単純なpostgresql関数呼び出しが機能しないのはなぜですか?

  29. 29

    この関数がパイプ変数で機能しないのはなぜですか?

ホットタグ

アーカイブ