私はまだHaskellの初心者であり、今は頭がおかしいと思います。次のようなコードがあります。
data World = World {
intStack :: [Int],
boolStack :: [Bool]
} deriving Show
instance IntStack World where
getIntStack = intStack
putIntStack ints (World _ bools) = World ints bools
instance BoolStack World where
getBoolStack = boolStack
putBoolStack bools (World ints _) = World ints bools
class IntStack a where
getIntStack :: a -> [Int]
putIntStack :: [Int] -> a -> a
class BoolStack a where
getBoolStack :: a -> [Bool]
putBoolStack :: [Bool] -> a -> a
(<=>) :: (IntStack c, BoolStack c) => c -> c
(<=>) w = putIntStack xs . putBoolStack ((x == x'):bs) $ w
where (x:x':xs) = getIntStack w
bs = getBoolStack w
(<+>) :: (IntStack c) => c -> c
(<+>) w = putIntStack ((x+x'):xs) w
where (x:x':xs) = getIntStack w
私の焦点(今のところ関数のエラーケースを無視する)は、基になるデータ型が関数に必要なインターフェイスを実装していると仮定して、(<=>)や(<+>)などの関数をチェーンできるようにすることです。
状態モナドを使用してこれを大幅にクリーンアップできるように感じますが、IntStack、BoolStackなどを実装するデータ型を変更できるように構造化する方法がわかりません。
これがひどく漠然とした説明であることは知っていますが、上記のコードはおそらく絶対に間違った方法だと思います。
フィードバックをありがとう!