我想做的是将Reader Monad构建为Applicative 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
我希望它给我错误
我正在尝试创建自己的Reader Monad来实现这一点,但还没有完全弄清楚。
我想象的是这样的(显然这只是一个概述)
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