Offenbar ein wenig abwesend, schrieb ich something like folgendes:Wann (wenn überhaupt) können Synonyme teilweise eingegeben werden?
{-# LANGUAGE ConstraintKinds #-}
{-# LANGUAGE TypeFamilies #-}
class Foo f where
type Bar f :: *
retbar :: Bar f -> IO f
type Baz f = (Foo f, Eq f)
-- WithBar :: * -> (*->Constraint) -> * -> Constraint
type WithBar b c f = (c f, Bar f ~ b)
instance Foo() where
type Bar() =()
retbar = return
naim :: WithBar() Baz u => IO u -- why can I do this?
naim = retbar()
main = naim :: IO()
Erst nach erfolgreich kompilieren, erkannte ich, diese sollte nicht tatsächlich funktionieren: Baz
als eine Art Synonym mit einem Argument definiert ist, aber hier benutze ich es ohne ein direktes Argument. Normalerweise bellt mich GHC an Type synonym ‘Baz’ should have 1 argument, but has been given none
wenn ich sowas versuche.
Nun versteh mich nicht falsch: Ich würde wirklich gerne in der Lage sein, das zu schreiben, und es ist einfach genug zu sehen, wie es in diesem bestimmten Beispiel funktionieren könnte (WithBar
würde die Signatur naim :: (Foo u, Bar u ~()) => IO u
ergeben, die sicherlich ist gut), aber was ich nicht verstehe, warum es eigentlich genau so hier funktioniert. Ist es vielleicht nur ein Bug in ghc-7.8.2
dies zu erlauben?
Dieses Verhalten wird von [LiberalTypeSynonyms] (https://downloads.haskell.org/~ghc/7.6.3/docs/html/users_guide/data-type-extensions.html#type-synonyms) aktiviert. Wenn der Compiler aktiviert ist, erweitert er insbesondere alle Typensynonyme, bevor er nach teilweise verwendeten Synonymen sucht. Ich vermute, dass einer von TypeFamilies oder ContraintKinds LiberalTypeSynonyms impliziert. – user2407038
@ user2407038 Merkwürdigerweise implizieren sie es nicht. –