所以我是Haskell的新手,可能會問一個非常愚蠢的問題。 我試圖讓下面的代碼運行:返回case in do塊
asdf :: Maybe a -> Maybe a
asdf k = do
return $ case k of
Nothing -> Nothing
Just x -> Just x
我知道,這基本上是fmap
,只有與回報是不義的事。我真正想要做的是以下
vote :: PostId -> Bool -> Maybe (Int, Int)
vote id v = do
p <- runSQL $ P.get id
return $ case p of
Nothing -> Nothing
Just p -> do
let uv = postUpvotes p
let dv = postDownvotes p
let nuv = if v then uv + 1 else uv
let ndv = if not v then dv + 1 else dv
runSQL $ update id [PostUpvotes =. nuv, PostDownvotes =. ndv]
(nuv, ndv)
我想這有多個問題。我的第一個例子究竟出了什麼問題?對第二個問題的處理方式是完全錯誤的還是有什麼問題?你會如何寫它?
'runSQL'的類型是什麼?我認爲它不是純粹的,所以你不能在返回'Maybe(Int,Int)'的函數中運行它。 – Lee
它來自本教程:https://www.spock.li/tutorials/rest-api – lbrndnr
除非您在'IO' monad中返回一個值,否則不能執行IO,可能類似於IO(Maybe(Int(Int,智力))'。 – chi