我喜欢阅读关于我不理解的概念的代码片段。有没有什么片段可以展示monads的辉煌?更重要的是,我如何应用monad来使我的工作变得更容易。
我大量使用jQuery。这是我所知道的一个很酷的monads应用程序。
发布于 2010-10-07 07:14:47
像其他人一样,我认为这个问题太笼统了。我认为大多数答案(像我的答案)都会给出一些巧妙的例子,利用一个特定的monad。monads的真正强大之处在于,一旦您将它们理解为一种抽象,您就可以将这些知识应用于您遇到的任何新的monads (在Haskell中有很多)。这反过来意味着您可以很容易地弄清楚新代码做了什么以及如何使用它,因为您已经知道了接口和一些控制其行为的规则。
无论如何,下面是一个使用我编写的测试运行脚本中的List monad的示例:
runAll :: IO ()
runAll = do
curdir <- getCurrentDirectory
sequence $ runTest <$> srcSets <*> optExeFlags <*> optLibFlags
setCurrentDirectory curdir从技术上讲,我使用的是应用程序接口,但如果这让您感到困扰,您可以将<*>从Control.Monad更改为ap。
其中很酷的一点是,它为列表"srcSets“、"optExeFlags”和"optLibFlags“中的每个参数组合调用runTest,以便为这些集合中的每个集合生成分析数据。我认为这比我在C中所做的(3个嵌套循环)要好得多。
发布于 2010-10-07 05:37:03
你的问题真的很模糊--就像在问,“展示一个使用变量的代码示例”。这是编程的本质,任何代码都会成为一个例子。因此,我将向您提供最近访问的Haskell函数,该函数在我的编辑器中仍处于打开状态,并解释我为什么使用一元控制流。
这是我的xmonad配置文件中的代码片段。它是布局实现的一部分,当有一个窗口要管理时,该布局以某种方式运行,而对于多个窗口,则以另一种方式运行。此函数接受一条消息并生成新的布局。但是,如果我们决定不做任何更改,则不返回任何内容:
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的情况。
发布于 2010-10-07 17:29:00
本质上,monad是“命令式微型语言”。因此,它们使您能够使用任何命令式结构,如异常(Maybe)、日志记录(Writer)、输入/输出(IO)、状态(State)、非确定性(列出[a])、解析器(Parsec、ReadP)或其组合。
有关更高级的示例,请查看我的operational package的示例代码。特别地,
https://stackoverflow.com/questions/3876399
复制相似问题