Routing 在Elm中,我如何口头表达函数类型defn:`route:Url.Parser(route->;a)a`?
我试图从以下方面理解此代码:Routing 在Elm中,我如何口头表达函数类型defn:`route:Url.Parser(route->;a)a`?,routing,elm,Routing,Elm,我试图从以下方面理解此代码: route:Url.Parser(route->a)a 路线= Url.oneOf [Url.map Home-top ,Url.map BlogList(s“blog”stringParam“search”) ,Url.map BlogPost(s“blog”int) ] 它是:“路由是一个函数,它采用1)一个解析器,2)一个函数采用路由,并返回一个a,3)一个a” 这似乎不正确,因为如果它只是列出参数,那么它在哪里表示route本身的返回值 我对elm很陌生,
route:Url.Parser(route->a)a
路线=
Url.oneOf
[Url.map Home-top
,Url.map BlogList(s“blog”stringParam“search”)
,Url.map BlogPost(s“blog”int)
]
它是:“路由
是一个函数,它采用1)一个解析器
,2)一个函数采用路由
,并返回一个a
,3)一个a
”
这似乎不正确,因为如果它只是列出参数,那么它在哪里表示route
本身的返回值
我对elm很陌生,但这里让我感到不舒服的是
->
包含在参数中,然后在末尾没有->
指示路线返回的内容 因为在route=
中只看到=
前面的函数名,这意味着它不带参数。
您还可以在注释中看到,因为没有->
。
括号内有一个
route
因此,返回一个Url.Parser(route->a)a
据我所知,它返回一个类型
其中a
是一个函数(Route->a)
和b
可以是任何东西(这里称为a
,但它与此无关)
->
是指类型解析器“封装”的函数。
我不知道如何更好地解释它,但看看库函数。它们以类似的方式工作
简单的答案是route
这里实际上不是一个函数,而是一个常量:它代表一种特殊的解析器
当然,现在这就提出了一个更困难的问题:它代表什么样的解析器
这是一个相当棘手的问题。我相信有一些解析器组合器的背景知识可能会在这里有所帮助()
但不管怎样,我花了一段时间,可能还是弄错了。
以下是我经历的步骤:
让我们看看使用解析器可以做什么。您可以使用parsePath
或parseHash
执行它。其中每一个都承诺,如果您提供类型为解析器(a->a)a
(其中a
是泛型类型变量)的解析器
,那么它将把位置
变成可能是
让我们看看您有什么样的解析器原语<例如,code>string
是Parser(string->a)a
,而int
是Parser(int->a)a
现在,看看组合词,尤其是
,它是解析器ab->Parser bc->Parser ac
。如果您编写stringint
,您将得到一个解析器(string->int->c)c
。这是可能的,因为string
中的类型变量可以替换为Int->c
,因此它变成解析器(string->Int->c)(Int->c)
以3号为基础。我认为解析器ab
表示一个解析器,它可以解析复杂a
的一部分,从而将其简化为一个更简单的b
但从软件包用户的角度来看,情况正好相反。如果使用数据类型Route
表示路由,则必须定义解析器(Route->a)a
,才能将url转换为内部表示。如果Route
的一个构造函数类似于MyTwoParamsRoute String Int
,那么首先需要使用一些组合符(
或
)定义myTwoParamsParser:Parser(String->Int->a)a
)然后使用map MyTwoParamsRoute myTwoParamsParse
实际应用构造函数
因此,对您的原始问题的长答案是:route:Parser(route->a)a
表示一个解析器,它可以从某个字符串(通常是url的哈希或路径部分)中解析route
,同时提供一种可能性,即一旦字符串被route
表示的内容减少,其余部分可以由另一个解析器进一步解析。“因为您只看到=in route=前面的函数名,这意味着它不带参数。”这不一定是真的!如果定义一个由部分应用的函数组成的函数,它仍然可以接受一个参数。请参见此示例:
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)
]