Я все еще новичок в 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 и т. д.
Я знаю, что это ужасно расплывчатое описание, но я чувствую, что приведенный выше код, вероятно, абсолютно неправильный способ сделать это.
Спасибо за любой отзыв!