Так я напечатал это доПочему я получаю конфликт?
{-# 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 -> a' for' m' в первом экземпляре. –
@ReidBarton oh, duh. По какой-то причине я думал, что это не сломает. – PyRulez
Вы можете сделать эту компиляцию и потенциально делать то, что хотите (хотя я не уверен, что это такое, я не совсем уверен), если вы измените второй экземпляр на экземпляр (Mconcat ma, o ~ (m -> a)) => Mconcat mo' - для этого требуется 'UndecidableInstances'. 'OverlappingInstances' или' OVERLAPS' для более поздних версий второго экземпляра. – user2407038