Уважаеми експерти на Haskell/GHC,
Наистина не разбирам защо GHC отчита припокриващи се случаи, докато само един всъщност е валиден според предоставените контексти. Например, нека разгледаме следната част от кода:
{-# LANGUAGE FlexibleInstances #-}
class C a where
foo :: a -> String
foo x = "OK"
instance C Bool
instance (C a) => C [a]
instance (C a) => C [(Char, a)]
main = print $ foo [('a', True)]
Компилирането му дава:
Test.hs:13:16: error:
* Overlapping instances for C [(Char, Bool)]
arising from a use of `foo'
Matching instances:
instance C a => C [a] -- Defined at Test.hs:9:10
instance C a => C [(Char, a)] -- Defined at Test.hs:11:10
* In the second argument of `($)', namely `foo [('a', True)]'
In the expression: print $ foo [('a', True)]
In an equation for `main': main = print $ foo [('a', True)]
Въпросът е, че ('a', True)
има тип (Char, Bool)
, който не е екземпляр на C
. Следователно instance C a => C [a]
не е приложимо към стойността [('a', True)]
.
Следователно, защо GHC го разглежда?
Въпросът наистина е за разбирането на поведението на GHC, а не за това как да се избегне проблемът (напр. използване на OverlappingInstances
). Дали защото контекстите не се използват при "разрешаване" на извикване на функция? И ако да защо?
Благодаря предварително!