एक अनुप्रयोगी functor रीडर इकाई है कि कुछ इस तरह से करता है से बाहर कर मुझे क्या करना चाहते हैं की एक संयोजन बनाना:एक रीडर और हो सकता है कि इकाई (अनुप्रयोगी functor)
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]
हालांकि, कुछ अगर चलाने जैसे
runReader myDataFromApplicative [1]
इसके बजाय मुझे
MyData 0 0
देने की
मैं चाहता हूँ यह मेरे Error
मैं इसे पूरा करने के लिए अपना खुद का रीडर मोनाड बनाने के साथ खेल रहा था, लेकिन इसे काफी समझ नहीं पाया।
क्या मैं कल्पना कुछ इस तरह (जाहिर है यह सिर्फ एक रूपरेखा
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]
है जो होगा उत्पादन
Success MyData 3 3
Error