Как создать экземпляр 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