나는 여전히 하스켈을 초보자로 생각하고 있으며 나는 지금 내 머리 위로 떠 올랐다. 다음과 같은 코드가 있습니다. (현재 기능의 경우 오류를 무시하고)복합 국가 모나드 구조
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 등을 구현 어떤 데이터 유형에 대한 변경을 허용하도록을 구성하는 방법을 잘 모르겠습니다 ..
내가 아는 이것은 끔찍한 모호한 설명이지만 위의 코드가 아마 그것에 대해 절대적으로 잘못된 방법이라고 생각합니다.
의견을 보내 주셔서 감사합니다.
예. 렌즈를 발명했습니다. 지금 패키지를 hackage에서 꺼내고 있습니다. +1 – pat
정말 고마워요. 얼마나 유용할까요? –