{-# LANGUAGE KindSignatures,TypeFamilies,FlexibleInstances #-}
{-# LANGUAGE CPP #-}
data Poo
data HooBar
data Bar
type family Hoo b :: *
type instance Hoo Bar = HooBar
class Pooable a where
poo :: a -> Poo
f :: ( Hoo b ~ HooBar) => b
instance {-# OVERLAPPABLE #-} ( b ~ Bar) => Pooable b where
#if 1
-- 0 にすると問題なく通る.
instance {-# OVERLAPPING #-} Pooable ( ) where
#endif
x = poo f -- (f :: Bar) -- 型注釈入れると勿論通る.
ey0jIExBTkdVQUdFIEtpbmRTaWduYXR1cmVzLFR5cGVGYW1pbGllcyxGbGV4aWJsZUluc3RhbmNlcyAjLX0Key0jIExBTkdVQUdFIENQUCAjLX0KCmltcG9ydCBQcmVsdWRlCgpkYXRhIFBvbwpkYXRhIEhvb0JhcgpkYXRhIEJhcgp0eXBlIGZhbWlseSBIb28gYiA6OiAqCnR5cGUgaW5zdGFuY2UgSG9vIEJhciA9IEhvb0JhcgoKY2xhc3MgUG9vYWJsZSBhIHdoZXJlCiAgcG9vIDo6IGEgLT4gUG9vCgpmIDo6IChIb28gYiB+IEhvb0JhcikgPT4gYgpmID0gdW5kZWZpbmVkCgppbnN0YW5jZSB7LSMgT1ZFUkxBUFBBQkxFICMtfSAoYiB+IEJhcikgPT4gUG9vYWJsZSBiIHdoZXJlCiAgcG9vID0gdW5kZWZpbmVkCgojaWYgMQogIC0tIDAg44Gr44GZ44KL44Go5ZWP6aGM44Gq44GP6YCa44KLLgppbnN0YW5jZSB7LSMgT1ZFUkxBUFBJTkcgIy19IFBvb2FibGUgKCkgd2hlcmUKICBwb28gPSB1bmRlZmluZWQKI2VuZGlmCgp4ID0gcG9vIGYgLS0gKGYgOjogQmFyKSAtLSDlnovms6jph4jlhaXjgozjgovjgajli7/oq5bpgJrjgosuCm1haW4gPSBwcmludCAib2si
compilation info
[1 of 1] Compiling Main ( prog.hs, prog.o )
prog.hs:27:9: error:
• Couldn't match type ‘Hoo a0’ with ‘HooBar’
arising from a use of ‘f’
The type variable ‘a0’ is ambiguous
• In the first argument of ‘poo’, namely ‘f’
In the expression: poo f
In an equation for ‘x’: x = poo f
stdout