6

この回答は、引数を合計する多変量関数を示しています。

class SumRes r where 
    sumOf :: Integer -> r

instance SumRes Integer where
    sumOf = id

instance (Integral a, SumRes r) => SumRes (a -> r) where
    sumOf x = sumOf . (x +) . toInteger

のすべてのメンバーに対して、この関数の一般化されたバージョンを作成しましたNum

class (Num n) => MySumType n r where
    mySum :: n -> r

instance (Num n) => MySumType n n where
    mySum x = x

instance (Num n, MySumType n r) => MySumType n (n->r) where
    mySum x = mySum . (x +)

ただし、これは のような呼び出しでのみ機能しますmySum (1::Int) (3::Int) (2::Int) :: Int。引数に型指定子がないと、次のエラーが発生します。

「mySum」の使用に起因する (MySumType n0 Float) のインスタンスはありません

可能な修正: (MySumType n0 Float) のインスタンス宣言を追加します。

式: mySum 1.0 :: Float

「it」の式: it = mySum 1.0 :: Float

この問題の原因は何ですか?どうすれば修正できますか? 整数リテラルの型が であることに関係しているのではないかと思いますNum a => a。また、拡張機能に依存しない上記の機能と同等の機能はありますか? 上記で使用されているのは、複数のパラメーター型クラスと柔軟なインスタンスです。

4

1 に答える 1