Haskell 什么是<|&燃气轮机;在哈斯克尔?

Haskell 什么是<|&燃气轮机;在哈斯克尔?,haskell,haskell-snap-framework,Haskell,Haskell Snap Framework,我仍在学习haskell和web框架。在他们的hello world示例中,有一个类似于 site::Snap() 场地= ifTop(写为“你好世界”) 路线[(“foo”,writeBS“bar”) ,(“echo/:echoparam”,echoHandler) ] 目录“static”(serveDirectory.) 为此,谷歌搜索具有惊人的挑战性,snap文档只是将用作名词。它是什么,它做什么?它是基本包中模块的可选类型类中的一个方法 通常,这意味着您正在处理一种可能会失败并继续

我仍在学习haskell和web框架。在他们的hello world示例中,有一个类似于

site::Snap()
场地=
ifTop(写为“你好世界”)
路线[(“foo”,writeBS“bar”)
,(“echo/:echoparam”,echoHandler)
] 
目录“static”(serveDirectory.)

为此,谷歌搜索具有惊人的挑战性,snap文档只是将
用作名词。它是什么,它做什么?

它是
基本
包中模块的
可选
类型类中的一个方法

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

x <|> y :: m a
xy::ma
是一种“尝试”
x
的计算,如果失败,则“尝试”
y
。这种类型的计算实例化了
备选方案

引用

如果您不熟悉Haskell,您可能会对 . 它只是一个计算其第一个参数的二进制运算符, 如果失败,则评估第二个。如果第一个参数 成功,然后停止,不计算第二个参数

站点函数用于连接以下三个不同的函数: 保护呈现的页面。首先,ifTop函数运行。这 如果请求的URL为http://site.com,则函数成功。如果 发生,然后Snap发送一个“hello world”响应。否则 执行路由功能


我同意Xeo的观点,即忽略[][1,2,3]中的空列表,但在这种情况下,编译器可能会将空列表与非空列表连接起来。我已将ghci设置为自动显示其打印内容的类型。下面的一些结果表明,在列表的情况下,和++可能是等效的:

λ: [] <|> [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]
λ:[[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]
在上面的例子中,它具有++的效果,但是还有更多的效果。首先,我们阅读了以下内容: “此组合符定义为等于MonadPlus类的mplus成员和Control.Applicative.Alternative的(Control.Applicative.)成员。” 关于黑客“Control.Monad”的讨论,我们读到: “msum::MonadPlus m=>[MA]->MA源”,后跟 “这概括了基于列表的concat函数。” “做什么?”这个问题的答案植根于理解Haskell编译器在遇到问题时会做什么,比如“[[1,2,3]”?他们只是忽略了[]吗?他们是否执行连接例程?要想弄清楚如何处理这个奇怪的重载操作符,需要进行一些步骤。难怪程序员被它迷惑了,只知道在特殊用例中使用它的效果

用于在满足条件后立即跳出递归循环。下面是一些代码来说明这是如何工作的:

λ: 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]
λ:没什么只有6只有7
只有6个
它::Num a=>可能是a
λ:没什么只是[1,2]没什么只是[3,4]
只是[1,2]
it::Num t=>可能[t]

受够了这里的反对票,我在这里学到了一些我根本无法用谷歌搜索到的东西。@Edgararroutiounian我怎么能自己回答这个问题?但我怎么知道要加载什么包呢?或者它需要从包中加载?这不是语言公理吗?你用。好吧,这就是我需要的提示,谢谢@VincentSavard.+1是的,我现在明白了。这就是我阅读代码并忽略副本时得到的结果。描述不太正确。
的具体功能取决于实例,例如,对于
[]
,它只是忽略空列表:
[][[1,2,3]==[1,2,3]
。引用的文本仅描述了Snap的相关实例。
λ: 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]