【发布时间】:2021-04-09 12:26:43
【问题描述】:
我有以下代码 sn-p,它有点工作:
launchTask :: (DeviceRepo m) => TaskSpec -> m (Maybe Task)
launchTask taskSpec@TaskSpec { taskSpecImage = image
, taskSpecRequirement = requirement
} = do
mayDevice <- getDeviceMatchingRequirement requirement
case mayDevice of
Nothing -> return Nothing
Just device -> do
mayContainer <- createContainer device requirement
case mayContainer of
Nothing -> return Nothing
Just container ->
return $
Just
Task
{ taskName = pack image
, taskStatus = TaskStatusRunning
, taskSpec = taskSpec
, taskContainerId = containerId container
}
但是,我觉得这不是很地道。堆叠主要计算(来自 DeviceRepo m)和可能的 Maybe monad 的正确方法是什么,以便如果缺少任何值,则立即返回 Nothing?
编辑:我尝试使用MaybeT,但类型不匹配
launchTask2 :: (DeviceRepo m) => TaskSpec -> m (Maybe Task)
launchTask2 taskSpec@TaskSpec { taskSpecImage = image
, taskSpecRequirement = requirement
} = runMaybeT launcher
where
launcher :: MaybeT m Task
launcher =
getDeviceMatchingRequirement requirement >>= \device ->
createContainer device requirement >>= \container ->
return
Task
{ taskName = pack image
, taskStatus = TaskStatusRunning
, taskSpec = taskSpec
, taskContainerId = containerId container
}
• Couldn't match expected type ‘Device’
with actual type ‘Maybe Device’
• In the first argument of ‘createContainer’, namely ‘device’
In the first argument of ‘(>>=)’, namely
‘createContainer device requirement’
In the expression:
createContainer device requirement
>>=
\ container
-> return
Task
{taskName = pack image, taskStatus = TaskStatusRunning,
taskSpec = taskSpec, taskContainerId = containerId container}
|
58 | createContainer device requirement >>= \container ->
| ^^^^^^
【问题讨论】:
-
我认为您正在寻找
MaybeTmonad 转换器:hackage.haskell.org/package/transformers-0.5.6.2/docs/…
标签: haskell monads monad-transformers