我正在尝试执行类似以下操作,如果 State-Monad 的状态不满足特定条件,我想返回错误消息,是否可以在不使用
lift
和 ExceptT
或其他的情况下完成变压器单子?
type Log = State [String] ()
stateCheckDuplicate :: String -> Either String Log
stateCheckDuplicate elem =
Right (do
log <- get
if lookup elem log /= Nothing then Left "Duplicate elements"
else
(put (elem:log)))
如果我理解
stateCheckDuplicate
应该做什么,那么您需要与 stateCheckDuplicate
同构的 String -> [String] -> Either String [String]
类型。那么你的实现将如下所示:
stateCheckDuplicate :: String -> [String] -> Either String [String]
stateCheckDuplicate msg logs
| msg `elem` logs = Left "Duplicate elements"
| otherwise = Right $ msg : logs
如你所见,没有 State,也没有 exceptT,也没有 liftXXX。但也许有一个问题,这个函数“很难”与其他函数组合。要解决这个问题需要了解您尝试做什么。