Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/jsf/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Routing 在Elm中,我如何口头表达函数类型defn:`route:Url.Parser(route->;a)a`?_Routing_Elm - Fatal编程技术网

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)
            ]