我还在学习haskell并查看snap网络框架。在他们的hello world示例中,有一个看起来像<|>
site :: Snap ()
site =
ifTop (writeBS "hello world") <|>
route [ ("foo", writeBS "bar")
, ("echo/:echoparam", echoHandler)
] <|>
dir "static" (serveDirectory ".")
谷歌搜索具有惊人的挑战性,快照文档只使用<|>
作为名词。它是什么,它做了什么?
答案 0 :(得分:9)
这是Alternative
包中模块Control.Applicative
中base
类型类的方法。
通常,这意味着您正在处理一种可能失败并继续的计算。如果x
和y
都输入为m a
,其中m
标记了我们正在谈论的这种计算
x <|> y :: m a
是“尝试”x
的计算,如果失败,则“尝试”y
。这种计算实例化Alternative
。
答案 1 :(得分:2)
如果您不熟悉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]