首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >monads如何让我的工作变得更容易?向我展示一些很酷的代码

monads如何让我的工作变得更容易?向我展示一些很酷的代码
EN

Stack Overflow用户
提问于 2010-10-07 04:03:43
回答 5查看 964关注 0票数 5

我喜欢阅读关于我不理解的概念的代码片段。有没有什么片段可以展示monads的辉煌?更重要的是,我如何应用monad来使我的工作变得更容易。

我大量使用jQuery。这是我所知道的一个很酷的monads应用程序。

EN

回答 5

Stack Overflow用户

发布于 2010-10-07 07:14:47

像其他人一样,我认为这个问题太笼统了。我认为大多数答案(像我的答案)都会给出一些巧妙的例子,利用一个特定的monad。monads的真正强大之处在于,一旦您将它们理解为一种抽象,您就可以将这些知识应用于您遇到的任何新的monads (在Haskell中有很多)。这反过来意味着您可以很容易地弄清楚新代码做了什么以及如何使用它,因为您已经知道了接口和一些控制其行为的规则。

无论如何,下面是一个使用我编写的测试运行脚本中的List monad的示例:

代码语言:javascript
复制
runAll :: IO ()
runAll = do
  curdir <- getCurrentDirectory
  sequence $ runTest <$> srcSets <*> optExeFlags <*> optLibFlags
  setCurrentDirectory curdir

从技术上讲,我使用的是应用程序接口,但如果这让您感到困扰,您可以将<*>从Control.Monad更改为ap

其中很酷的一点是,它为列表"srcSets“、"optExeFlags”和"optLibFlags“中的每个参数组合调用runTest,以便为这些集合中的每个集合生成分析数据。我认为这比我在C中所做的(3个嵌套循环)要好得多。

票数 3
EN

Stack Overflow用户

发布于 2010-10-07 05:37:03

你的问题真的很模糊--就像在问,“展示一个使用变量的代码示例”。这是编程的本质,任何代码都会成为一个例子。因此,我将向您提供最近访问的Haskell函数,该函数在我的编辑器中仍处于打开状态,并解释我为什么使用一元控制流。

这是我的xmonad配置文件中的代码片段。它是布局实现的一部分,当有一个窗口要管理时,该布局以某种方式运行,而对于多个窗口,则以另一种方式运行。此函数接受一条消息并生成新的布局。但是,如果我们决定不做任何更改,则不返回任何内容:

代码语言:javascript
复制
handleMessage' :: AlmostFull a -> SomeMessage -> Int -> Maybe (AlmostFull a)
handleMessage' l@(AlmostFull ratio delta t) m winCount =
  case winCount of
    -- keep existing Tall layout, maybe update ratio
    0 -> finalize (maybeUpdateRatio $ fromMessage m) (Just t)
    1 -> finalize (maybeUpdateRatio $ fromMessage m) (Just t)

    -- keep existing ratio, maybe update Tall layout
    _ -> finalize (Just ratio) (pureMessage t m)
  where
    finalize :: Maybe Rational -> Maybe (Tall a) -> Maybe (AlmostFull a)
    finalize ratio t = ratio >>= \ratio -> t >>= \t ->
      return $ AlmostFull ratio delta t

    maybeUpdateRatio :: Message -> Maybe Rational
    maybeUpdateRatio (Just Shrink) = Just (max 0 $ ratio-delta)
    maybeUpdateRatio (Just Expand) = Just (min 1 $ ratio+delta)
    maybeUpdateRatio _             = Nothing

我们根据当前的窗口管理器状态(由X monad中的计算确定,我们将其结果传递给此函数以保持实际逻辑的纯净)来决定返回什么--如果有0或1个窗口,我们将消息传递给AlmostFull布局,并让它决定要做什么。这就是f函数。如果消息更改了比率,则返回Just新比率,否则不返回任何内容。另一半是类似的;如果有2个或更多的窗口,它将消息传递到Tall的处理程序,如果这是用户要求的,则返回Just一个新的Tall布局,否则返回Nothing

finalize函数是最有趣的部分;它从Maybe包装器中提取ratio (所需的新比率)和t (所需的新Tall布局)。这意味着两者都不能为Nothing,否则我们会自动从函数中返回Nothing

我们在这里使用Maybe monad的原因是,我们可以根据所有可用的结果来编写函数,而不必编写任何代码来处理出现Nothing的情况。

票数 2
EN

Stack Overflow用户

发布于 2010-10-07 17:29:00

本质上,monad是“命令式微型语言”。因此,它们使您能够使用任何命令式结构,如异常(Maybe)、日志记录(Writer)、输入/输出(IO)、状态(State)、非确定性(列出[a])、解析器(Parsec、ReadP)或其组合。

有关更高级的示例,请查看我的operational package的示例代码。特别地,

  • WebSessionState.lhs实现了web会话,这些会话的编程方式就好像服务器是一个持久的进程,而实际上它们是异步交付的。
  • TicTacToe.hs展示了一个游戏引擎,其中玩家和AI的编写就像在并发进程中运行一样。
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3876399

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档