所以我打这件事为什么我会发生冲突?
{-# LANGUAGE FlexibleInstances, MultiParamTypeClasses, FunctionalDependencies #-}
import Data.Monoid
class Monoid m => Mconcat m a | a -> m where
mcon :: m -> a
instance Monoid m => Mconcat m m where
mcon m = m
instance Mconcat m a => Mconcat m (m -> a) where
mcon m m' = mcon (m `mappend` m')
,我得到
[1 of 1] Compiling Main (pad.hs, interpreted)
pad.hs:8:10:
Functional dependencies conflict between instance declarations:
instance Monoid m => Mconcat m m -- Defined at pad.hs:8:10
instance Mconcat m a => Mconcat m (m -> a)
-- Defined at pad.hs:11:10
Failed, modules loaded: none.
的事情是,虽然,m
和m->a
不能相同!为什么它给我一个冲突? ?(而且,任何秘诀,如何让一个polyvariadic mconcat(在printf
库的风格)
在第一个实例中用'm'替代'm'。 –
@ReidBarton哦,杜。出于某种原因,我认为这不会打破它。 – PyRulez
如果您将第二个实例更改为'instance(Mconcat ma,o〜(m - >),那么您可以进行编译,并且可能做你想做的事情(尽管我不确定那是什么,所以我不太确定) a))=> Mconcat mo' - 这需要'UndecidableInstances'。在第二个实例中用于更高版本的'OverlappingInstances'或'OVERLAPS'编译指示。 – user2407038