私がやりたいのは、次のようなことを行うReaderモナドからApplicativeFunctorを作成することです。
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