1

GHCジェネリックを使用しています。私の使用例は、遺伝子配列をエンコードおよびデコードしていることを除いて、wiki の例とほとんど同じです。

エラーが発生した場合にユーザーに報告できるように、既に読んだもののリストを保持することにするまで、これはすべて正常に機能していました。つまり、デフォルトの実装Showに制約を追加する必要があります。get問題は、制約の書き方がわからないことです。-- HELP!!!以下のコードのコメントを参照してください。

{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE DefaultSignatures #-}
{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE TypeOperators #-}

import Control.Monad.State.Lazy (StateT)
import qualified Control.Monad.State.Lazy as S (put, get, gets)
import Data.Functor.Identity (Identity)
import Data.Word (Word8, Word16)
import GHC.Generics

type Sequence = [Word8]

type Writer = StateT Sequence Identity

type Reader = StateT (Sequence, Int, [String]) Identity

class Genetic g where
  -- | Writes a gene to a sequence.
  put :: g -> Writer ()

  default put :: (Generic g, GGenetic (Rep g)) => g -> Writer ()
  put = gput . from

  -- | Reads the next gene in a sequence.
  get :: Reader (Either [String] g)

  default get :: (Generic g, GGenetic (Rep g), Show (Rep g x???)) -- HELP!!!
    => Reader (Either [String] g)
  get = do
    (_, start, _) <- S.get
    a <- gget
    (xs, stop, trace) <- S.get
    let msg = show start ++ ':' : show stop ++ ' ' : show a
    S.put (xs, stop, msg:trace)
    return $ fmap to a

class GGenetic f where
  gput :: f a -> Writer ()
  gget :: Reader (Either [String] (f a))
4

1 に答える 1