如果我有一个值,并且我想使用monads对它进行多次转换,我可以这样做,
func3 =<< func2 =<< func1 value
但如果我希望每个函数都有条件地执行,这就是我认为可以这样做的方式。
applyFuncs value = do
if condition1
then value' <- func1 value
else let value' = value
if condition2
then value'' <- func2 value'
else let value'' = value'
if condition3
then value''' <- func3 value''
else let value''' <- value''
return value'''
然而,写这个是乏味的,所以我在网上寻找解决方案,但不知怎的,我无法找到任何有用的东西。是否有可以像这样使用的库函数?
when' condition3 func3 =<< when' condition2 func2 =<< when' condition1 func1
答案 0 :(得分:1)
所以你有:
server = message.server
everyone = discord.PermissionOverwrite(read_messages=False, send_messages=False)
mine = discord.PermissionOverwrite(read_messages=True)
await client.create_channel(server, 'secret', (server.default_role, everyone), (server.me, mine))
overwrite = discord.PermissionOverwrite(read_messages=True, send_messages=True)
await client.edit_channel_permissions(message.channel, discord.utils.get(server.roles, name="InFight"), overwrite)
你说你可以用monad来做。为什么不使用monad?
value :: a
f1, f2, f3 :: a -> a
cond1,cond2,cond3 :: a -> Bool
或者不要只是做一两个帮手:
import Control.Monad.Trans.State
whenM f op =
do s <- f <$> get
if s then op else pure ()
all3 :: a -> a
all3 val = flip execState val $
do whenM cond1 $ modify f1
whenM cond2 $ modify f2
whenM cond3 $ modify f3