Не можете получить общий для этого типа? - PullRequest
0 голосов
/ 27 ноября 2018

Компиляция этого короткого фрагмента в GHC 8.6.2:

{-# LANGUAGE DeriveGeneric, PolyKinds #-}
import GHC.Generics

data Foo f
    = FA
    | FB (f (Foo f))
    deriving (Generic, Generic1)

Приводит к этой ошибке:

Can't make a derived instance of ‘Generic1 Foo’:
  Constructor ‘FB’ applies a type to an argument involving the last parameter
                   but the applied type is not of kind * -> *

Разве невозможно получить Generic для таких типов?Почему?

1 Ответ

0 голосов
/ 27 ноября 2018

Generic1 Foo не может быть получено, потому что Generic1 предназначено для типов * -> *, а не (* -> *) -> *.В принципе, может быть поддержка (* -> *) -> * с большим количеством конструкторов в GHC.Generics, но этот подход просто плохо масштабируется (он имеет гораздо больше неинтуитивных синтаксических ограничений, и у вас всегда будет та же проблема для более сложных типов).

На самом деле вы можете многое сделать с простым Generic, который перекрывается с изначально намеченными вариантами использования для Generic1.В противном случае вам понадобится что-то более мощное, чем GHC.Generics, например, недавно выпущенный kind-generics (содержит ссылки на статьи и хакерские ссылки).

...