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