この回答は、引数を合計する多変量関数を示しています。
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
。また、拡張機能に依存しない上記の機能と同等の機能はありますか? 上記で使用されているのは、複数のパラメーター型クラスと柔軟なインスタンスです。