здесь?
newtype Stack = MkStack {getStack :: Vector Integer}
deriving stock (Generic)
deriving newtype (Show, Eq, Semigroup, Monoid)
data AppState = MkAppState
{ buffer :: [Text]
, stack :: Stack
}
deriving stock (Generic, Show)
instance Semigroup AppState where
(<>) :: AppState -> AppState -> AppState
-- a <> b = MkAppState{buffer = a.buffer <> b.buffer, stack = a.stack <> b.stack}
a <> b = a & #buffer <>~ (b ^. #buffer) & #stack <>~ (b ^. #stack)
Компилятор говорит что stock стратегия не годится для них. Попробовал дописать deriving (Semigroup, Monoid) via (Stack) но эт тоже не сработало. Как мне быть? Просто писать инстансы вручную?
via работает только на ньютайпах. так что да, только руками
я когда-то делал via UnsafeCoerce, без понятия вышло или нет, нужно по чатам искать
{-# LANGUAGE DerivingStrategies #-} {-# LANGUAGE DerivingVia #-} {-# LANGUAGE DuplicateRecordFields #-} import Data.Monoid (Product, Sum) import Unsafe.Coerce (unsafeCoerce) newtype UnsafeCoerce b a = WrapUnsafeCoerce a instance (Semigroup b) => Semigroup (UnsafeCoerce b a) where (<>) = unsafeCoerce ((<>) :: b -> b -> b) instance (Monoid b) => Monoid (UnsafeCoerce b a) where mempty = unsafeCoerce (mempty :: b) data X = MkX {sum :: Int, product :: Int} deriving stock (Show) deriving (Semigroup, Monoid) via UnsafeCoerce (Sum Int, Product Int) X main = do let a = MkX {sum = 10, product = 20} let b = MkX {sum = 30, product = 40} print (a <> b) делать я так искренне не советую для этого есть https://hackage.haskell.org/package/generic-deriving-1.12.1/docs/Generics-Deriving-Monoid.html
А потом кто-то включает стрикт дата и начинает работать фанбокс смолл стрикт фиелдс
Обсуждают сегодня