【发布时间】:2020-01-05 00:08:00
【问题描述】:
我想在 do 块中实现以下目标:
do
if condition then
n0 <- expr0
else
n0 <- expr0'
n1 <- expr1
n2 <- expr2
return T n0 n1 n2
但除非我这样做,否则 Haskell 会给出编译错误:
do
if condition then
n0 <- expr0
n1 <- expr1
n2 <- expr2
return T n0 n1 n2
else
n0 <- expr0'
n1 <- expr1
n2 <- expr2
return T n0 n1 n2
它看起来很冗长,尤其是当有许多共享绑定表达式时。如何让它更简洁?
实际上,我正在尝试执行以下操作:
do
if isJust maybeVar then
n0 <- f (fromJust maybeVar)
n1 <- expr1
n2 <- expr2
return (T (Just n0) n1 n2)
else
n1 <- expr1
n2 <- expr2
return (T Nothing n1 n2)
以下仍然无法编译:
do
n0 <- if isJust maybeVar then Just (f (fromJust maybeVar)) else Nothing
n1 <- expr1
n2 <- expr2
return (T n0 n1 n2)
【问题讨论】:
-
你写的是
if ... then ... then,而不是if ... then ... else。 -
if isJust maybeVar then Just (f (fromJust maybeVar)) else Nothing拼写更好f <$> maybeVar。
标签: haskell conditional-statements bind monads do-notation