你问的基本上是如何
fmap
任意深入到一堆函数子中。这很容易通过作曲来完成
fmap
s
mgetRedis :: Redis.Connection -> [Text] -> IO [Maybe Text]
mgetRedis connection keys =
runRedis connection action
where
action = do
result <- Redis.mget $ tbs <$> keys
-- `result` is of type `Either Reply [Maybe BS.ByteString]`
case result of
Right values -> pure $ fmap T.decodeUtf8 <$> values
-- equivalent to (fmap . fmap) T.decodeUtf8 $ values
_ -> pure []
这个
fmap . fmap
模式重复,即你可以用
fmap . fmap . fmap
。但在这一点上,最好将整个堆栈视为一个函数子,这可以通过以下方式实现
莫纳德变压器
.