【发布时间】:2017-07-31 16:35:28
【问题描述】:
所以我是 Haskell 的新手,可能会问一个非常愚蠢的问题。 我尝试运行以下代码:
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)的函数中运行它。 -
除非在
IOmonad 中返回一个值,否则不能执行 IO,可能类似于IO (Maybe (Int, Int))。
标签: haskell functional-programming monads