Я получаю неожиданную ошибку при попытке скомпилировать небольшой файл Haskell с GHC 8.6.1 при использовании ConstraintKinds и TypeSynonymInstances.
Я хотел бы создать класс, который принимает класс в качестве параметраи я хотел бы использовать псевдоним при написании экземпляра.Вот код:
{-# LANGUAGE ConstraintKinds, KindSignatures, TypeSynonymInstances #-}
module TypeAlias where
import Data.Kind
class Foo a
class Bar a
class Baz (c :: * -> Constraint)
instance Baz Foo -- compiles
instance Baz Bar -- compiles
type FooBar a = (Foo a, Bar a) -- compiles
instance Baz FooBar -- fails!
-- TypeAlias.hs:17:10-19: error:
-- • The type synonym ‘FooBar’ should have 1 argument, but has been given none
-- • In the instance declaration for ‘Baz FooBar’
-- |
-- 17 | instance Baz FooBar
-- | ^^^^^^^^^^
Ошибка удивительна, потому что, насколько я могу судить, FooBar
имеет ожидаемый вид, а именно * -> Constraint
, но компилятор говорит, что ему следует передать аргумент.
Можно ли вообще использовать псевдоним ограничения в объявлении экземпляра, как я здесь пытаюсь?Если да, то как мне понять кажущееся противоречивым сообщение об ошибке?
(я знаю, что могу просто объявить FooBar
как класс вместо псевдонима, но я действительно не хочу, потому что я 'Я также хотел бы получить экземпляр, и в этот момент мне пришлось бы задействовать UndecidableInstances
.)