有条件地将函数应用于值的顺序

时间:2018-06-16 21:01:36

标签: haskell

如果我有一个值,并且我想使用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

1 个答案:

答案 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