在 Haskell 中应用更改到外部 Monad,而不使用 Transformer monad

问题描述 投票:0回答:1

我正在尝试执行类似以下操作,如果 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)))

haskell functional-programming monads monad-transformers state-monad
1个回答
0
投票

如果我理解

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。但也许有一个问题,这个函数“很难”与其他函数组合。要解决这个问题需要了解您尝试做什么。

© www.soinside.com 2019 - 2024. All rights reserved.