Как создать экземпляр Mk для GHC.Generics.U1?

Я работаю над контентом в блоге. Построение конструкторов данных с помощью GHC Generics. Мой предыдущий вопрос здесь.

Публикация имеет следующий код для создания Rep:

{-# LANGUAGE MultiParamTypeClasses, FunctionalDependencies #-}
{-# LANGUAGE FlexibleInstances, UndecidableInstances #-}
{-# LANGUAGE TypeOperators #-}

import GHC.Generics
import Data.Functor.Compose

class Functor f => Mk rep f | rep -> f where
  mk :: f (rep a)

instance Mk (K1 i c) ((->) c) where
  mk = \x -> K1 x

instance (Mk l fl, Mk r fr) => Mk (l :*: r) (Compose fl fr) where
  mk = Compose (fmap (\l -> fmap (\r -> l :*: r) mk) mk)

instance (Mk f f') => Mk (M1 i c f) f' where
  mk = M1 <$> mk

Можно ли создать аналогичный экземпляр для U1? Если так, то как?

1 ответ

Поскольку U1 не имеет структуры, вы должны быть в состоянии mk один из воздуха в Identity:

import Control.Monad.Identity

instance Mk U1 Identity where
    mk = pure U1
Другие вопросы по тегам