我试图从url-parser
了解此代码:
route : Url.Parser (Route -> a) a
route =
Url.oneOf
[ Url.map Home top
, Url.map BlogList (s "blog" <?> stringParam "search")
, Url.map BlogPost (s "blog" </> int)
]
它是:&#34; route
是一个函数,它采用1)Parser
,2)一个函数,它接受Route
并返回a
, 3)a
&#34;?
这似乎不正确,因为如果只是列出参数,那么它在哪里表示route
本身的返回值?
我对榆树很新,但是让我离开的是->
包含在parens中,然后在结尾处没有->
route
返回的内容。
答案 0 :(得分:1)
简单的答案是route
这里不是一个真正的函数,而是一个常量:它代表一种特殊的Parser
。
现在,这当然提出了它代表什么样的解析器这个更难的问题?
这是一个相当棘手的问题。我相信在解析器组合器上有一些背景可能对此有帮助(https://en.wikipedia.org/wiki/Parser_combinator)。
但无论如何,它花了我一段时间,我可能仍然会弄错。 这些是我经历的步骤:
Parser
可以做些什么。您可以使用parsePath
或parseHash
执行此操作。每个承诺,如果您提供Parser
类型Parser (a->a) a
(其中a
是通用类型变量),那么它会将Location
转换为Maybe a
} string
为Parser (String -> a) a
,而int
为Parser (Int -> a) a
。</>
,Parser a b -> Parser b c -> Parser a c
。如果您写string </> int
,您将获得Parser (String -> Int -> c) c
。这是可能的,因为string
中的类型变量可以替换为Int -> c
,因此它变为Parser (String -> Int -> c) (Int -> c)
。Parser a b
表示可以解析复杂a
的一部分的解析器,以将其简化为更简单的b
。Route
表示路线,则必须定义Parser (Route -> a) a
才能将网址转换为内部代表。如果Route
的某个构造函数与MyTwoParamsRoute String Int
类似,那么您首先需要使用某些组合器(myTwoParamsParser : Parser (String -> Int -> a) a
或</>
)来定义<?>
然后使用map MyTwoParamsRoute myTwoParamsParse
实际应用构造函数。所以对原始问题的答案很长:route : Parser (Route -> a) a
代表一个解析器,它可以解析某个字符串中的Route
(通常是url的散列或路径部分) - 同时提供一旦字符串被Route
表示的字符串缩小,其余的解析器可以进一步解析余数。
答案 1 :(得分:0)
由于您只在=
中的route =
之前看到函数名称,这意味着它不需要参数。
您还可以在注释中看到,因为没有->
。
括号内有一个。
route
因此,返回Url.Parser (Route -> a) a
。
根据我的理解,它会返回Parser a b
类型
其中a
是一个函数(Route -> a)
而b
可以是任何内容(此处名为a
,但它无关紧要。)
->
指的是类型Parser
“封装”的函数。
我不知道如何更好地解释它,但看看库函数。他们以类似的方式工作
http://package.elm-lang.org/packages/evancz/url-parser/2.0.1/UrlParser