Co chciałbym zrobić, to złożyć aplikacyjnych funktora z monady Reader, który robi coś takiego:Tworzenie kombinacji Reader i może Monad (aplikacyjnych funktora)
data MyData = Int Int
get2Sum :: Reader [Int] Int
get2Sum = do
myData <- ask
let fst2 = take 2 myData
case length fst2 of
2 -> return $ sum fst2
_ -> return 0
myDataFromApplicative = MyData <$> get2Sum <*> get2Sum
main = print $ runReader myDataFromApplicative [1,2]
Jednakże, jeśli uruchomić coś jak
runReader myDataFromApplicative [1]
Zamiast dać mi MyData 0 0
chcę dać mi Error
Grałem z tworzeniem własnego Reader Monad, aby to osiągnąć, ale nie mogłem tego rozgryźć.
Co ja sobie wyobrazić jest coś takiego (oczywiście jest to tylko zarys
data SuccessReader r a = Interm {runSuccessReader :: r -> SuccessReader a} | Success a | Error
throwError :: SuccessReader()
get2Sum :: Reader [Int] Int
get2Sum = do
myData <- ask
let fst2 = take 2 myData
case length fst2 of
2 -> return $ sum fst2
_ -> throwError
myDataFromApplicative = MyData <$> get2Sum <*> get2Sum
main = do
print $ runSuccessReader myDataFromApplicative [1,2]
print $ runSuccessReader myDataFromApplicative [1]
które wyjście
Success MyData 3 3
Error