什么是< |>在哈斯克尔?

时间:2014-05-17 22:18:20

标签: haskell haskell-snap-framework

我还在学习haskell并查看snap网络框架。在他们的hello world示例中,有一个看起来像<|>

的东西
site :: Snap ()
site =
    ifTop (writeBS "hello world") <|>
    route [ ("foo", writeBS "bar")
          , ("echo/:echoparam", echoHandler)
          ] <|>
    dir "static" (serveDirectory ".")

谷歌搜索具有惊人的挑战性,快照文档只使用<|>作为名词。它是什么,它做了什么?

3 个答案:

答案 0 :(得分:9)

这是Alternative包中模块Control.Applicativebase类型类的方法。

通常,这意味着您正在处理一种可能失败并继续的计算。如果xy都输入为m a,其中m标记了我们正在谈论的这种计算

x <|> y :: m a

是“尝试”x的计算,如果失败,则“尝试”y。这种计算实例化Alternative

答案 1 :(得分:2)

引用Snap tutorial

  

如果您不熟悉Haskell,您可能会对此感到疑惑   &LT; |取代。它只是一个二元运算符,用于计算其第一个参数,   如果失败,则评估第二个。如果第一个参数   成功了,然后在不评估第二个参数的情况下停止。

     

网站功能使用&lt; |&gt;连接三个不同的功能   保护哪些页面被渲染。首先,ifTop函数运行。这个   如果请求的URL是http:// site.com,则函数成功。如果说   发生了,然后Snap发出“hello world”的回复。否则   执行路线功能。

答案 2 :(得分:0)

我同意Xeo的程度&lt; |&gt; 具有忽略[]&lt; |&gt;中空列表的效果 [1,2,3],但在引擎盖下,编译器可能会将空列表与非空列表连接起来。我有ghci设置为自动显示它打印的类型。以下是一些结果,表明在列表的情况下,&lt; |&gt;和++可能是等价的:

λ: [] <|> [3,4]
[3,4]
it :: Num a => [a]
λ: [] ++ [3,4]
[3,4]
it :: Num a => [a]
λ: [1,2] <|> [3,4]
[1,2,3,4]
it :: Num a => [a]
λ: [1,2] ++ [3,4]
[1,2,3,4]
it :: Num a => [a]
λ: :t (<|>) [1,2] [3,4]
(<|>) [1,2] [3,4] :: Num a => [a]
λ: :t (++) [1,2] [3,4]
(++) [1,2] [3,4] :: Num a => [a]
λ: [1,2] <|> [] <|> [3,4]
[1,2,3,4]

好吧,&lt; |&gt;在上面的例子中有 ++ ++的效果,但不仅如此。在https://hackage.haskell.org/package/parsec-3.0.0/docs/Text-ParserCombinators-Parsec-Prim.html,我们读到了关于&lt; |&gt;: &#34;该组合子的定义等于MonadPlus类的mplus成员和Control.Applicative.Alternative的(Control.Applicative。&lt; |&gt;)成员。&#34; 转向Hackage&#34; Control.Monad&#34;讨论我们读到: &#34; msum :: MonadPlus m =&gt; [m a] - &gt;来源&#34;其次是 &#34;这概括了基于列表的concat函数。&#34; 问题的答案,&#34;什么&lt; |&gt;做什么?&#34;,根植于理解Haskell编译器在遇到&lt; |&gt;时所做的事情,比如&#34; []&lt; |&gt; [1,2,3]&#34 ;?他们只是忽略[]?他们执行连接例程吗?有一些步骤只是搞清楚这个奇怪的重载运算符是做什么的。毫无疑问,程序员对它感到困惑,并且只知道 在特殊用例中使用它的效果。

&LT; |&GT;一旦条件满足,就可以跳出递归循环。以下是一些代码,用于说明其工作原理:

λ: Nothing <|> Just 6 <|> Just 7
Just 6
it :: Num a => Maybe a

λ: Nothing <|> Just [1,2] <|> Nothing <|> Just [3,4]
Just [1,2]
it :: Num t => Maybe [t]