プロジェクトでは、リストとハッシュを合計する必要があります。私はHaskellはM.Map Int
がApplicative
のインスタンスであると考えているエラーを理解していれば、次のエラーData.Lazy.MapをNumのインスタンスにマップする
<interactive>:2:37:
Overlapping instances for Num (M.Map Int Int)
arising from a use of ‘+’
Matching instances:
instance (Ord k, Num b) => Num (M.Map k b)
-- Defined at Tweak.hs:15:10
instance (Applicative f, Num b) => Num (f b)
-- Defined at Tweak.hs:7:10
In the expression:
(M.fromList [(2 :: Int, 3 :: Int)]) + (M.fromList [(1, 2)])
In an equation for ‘it’:
it = (M.fromList [(2 :: Int, 3 :: Int)]) + (M.fromList [(1, 2)])
を生成GHCiの中で、この(M.fromList [(2 :: Int, 3 :: Int)]) + (M.fromList [(1, 2)])
を実行Num
インスタンス
{-# LANGUAGE FlexibleInstances #-}
module Tweak where
import Data.List
import qualified Data.Map.Lazy as M
import Control.Applicative
instance (Applicative f, Num b) => Num (f b) where
negate = fmap negate
(+) = liftA2 (+)
(*) = liftA2 (*)
fromInteger = pure . fromInteger
abs = fmap abs
signum = fmap signum
instance (Ord k, Num b) => Num(M.Map k b) where
negate = fmap negate
(+) = M.unionWith (+)
(*) = M.unionWith (*)
fromInteger = undefined
abs = fmap abs
signum = fmap signum
の2次の宣言になってしまいました。それはそうではないようです。 :i M.Map Int
収量
type role M.Map nominal representational
data M.Map k a
= containers-0.5.6.2:Data.Map.Base.Bin {-# UNPACK #-}containers-0.5.6.2:Data.Map.Base.Size
!k
a
!(M.Map k a)
!(M.Map k a)
| containers-0.5.6.2:Data.Map.Base.Tip
-- Defined in ‘containers-0.5.6.2:Data.Map.Base’
instance (Ord k, Num b) => Num (M.Map k b)
-- Defined at Tweak.hs:15:10
instance (Eq k, Eq a) => Eq (M.Map k a)
-- Defined in ‘containers-0.5.6.2:Data.Map.Base’
instance Functor (M.Map k)
-- Defined in ‘containers-0.5.6.2:Data.Map.Base’
instance (Ord k, Ord v) => Ord (M.Map k v)
-- Defined in ‘containers-0.5.6.2:Data.Map.Base’
instance (Ord k, Read k, Read e) => Read (M.Map k e)
-- Defined in ‘containers-0.5.6.2:Data.Map.Base’
instance (Show k, Show a) => Show (M.Map k a)
-- Defined in ‘containers-0.5.6.2:Data.Map.Base’
instance Foldable (M.Map k)
-- Defined in ‘containers-0.5.6.2:Data.Map.Base’
instance Traversable (M.Map k)
-- Defined in ‘containers-0.5.6.2:Data.Map.Base’
instance Ord k => Monoid (M.Map k v)
-- Defined in ‘containers-0.5.6.2:Data.Map.Base’
data Ability = ... | Int | ... -- Defined at Character.hs:60:41
data Int = GHC.Types.I# GHC.Prim.Int# -- Defined in ‘GHC.Types’
instance Bounded Int -- Defined in ‘GHC.Enum’
instance Enum Int -- Defined in ‘GHC.Enum’
instance Eq Int -- Defined in ‘GHC.Classes’
instance Integral Int -- Defined in ‘GHC.Real’
instance Num Int -- Defined in ‘GHC.Num’
instance Ord Int -- Defined in ‘GHC.Classes’
instance Read Int -- Defined in ‘GHC.Read’
instance Real Int -- Defined in ‘GHC.Real’
instance Show Int -- Defined in ‘GHC.Show’
このエラーは本当にわかりません。どんな助けも大歓迎です。
Haskellは制約を調べる前にインスタンスの解決を行いますので、実際にインスタンスforallall f bを定義しています。 Num(f b) 'は非常に一般的で、おそらくあなたが望むものではありません。制約はインスタンスが選択された後にのみチェックされます*。 –
はい、これは確かに私が欲しいものではありません。どのようにこれを解決するための任意のアイデア? – Ronan
これはあなたが求めているものかもしれませんが、あなたがここで求めているものを提供することは、高いコストがかかります。種類* - > *の上に他のNumインスタンスはありません。より良い仕組みは、 'newtype ANum f a = ANum(f a)'を作成し、インスタンスをnewtypeに焼くことです。誰かが書いた* - > *何かの可能性のあるnumインスタンスと競合することはありません。ユーザーはデータをあなたのユースケースと互換性のある形式にまとめることができます。 'newtype Poly a = Poly [a]'はインスタンスと重複しますが、確かに[] 'のアプリケーションを使って行うべきではありません! –