2017-04-01 26 views
1

我试图了解从url-parser验证码:在Elm中,我将如何表达口头函数类型defn:`route:Url.Parser(Route - > a)a`?

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

它是:“route是一个函数,1)Parser,2)函数,它接受一个Route并返回一个a,和3 )一个a“?

这似乎不正确,因为如果它只是列出参数,它在哪里表示route本身的返回值?

我对榆树很新,但是这里抛出的是包含在parens中,最后没有->表示route返回的结果。

回答

0

由于您在route =中的=之前只能看到函数名称,这意味着它不包含任何参数。 您也可以在注释中看到,因为没有->。 有一个内括号。

route因此,返回Url.Parser (Route -> a) a

从我的理解,它返回一个类型Parser a b 其中a是一个函数(Route -> a)b可以是任何东西(它是这里命名a,但它是不相关)。

->指的是Parser类型“封装”的功能。 我不知道如何更好地解释它,但看看图书馆的功能。他们在最简单的答案是,route这里是不是一个真正的功能类似的方式 http://package.elm-lang.org/packages/evancz/url-parser/2.0.1/UrlParser

+0

“由于您在= in route =之前看到的只是函数名称,这意味着它不需要参数。”这不一定是真的!如果你定义了一个由部分应用函数组成的函数,它仍然可以接受一个参数。看到这个例子:https://ellie-app.com/43z59m2G3Fba1/0 –

1

工作,但恒定的:它代表一种特殊的Parser

现在,这当然会引发更难的问题它代表什么样的解析器

这是一个相当棘手的问题。我相信解析器组合器有一些背景可能可以帮助(https://en.wikipedia.org/wiki/Parser_combinator)。

但无论如何,它花了我一段时间,我可能仍然是错误的。 这是我所经历的步骤:

  1. 让我们来看看,你可以用Parser做什么。您可以使用parsePathparseHash执行它。其中的每一个承诺,如果您提供Parser (a->a) a类型(其中a是一个泛型类型变量)的Parser那么它会变成一个LocationMaybe a
  2. 让我们来看看你有什么样的解析器原语。例如stringParser (String -> a) a,而intParser (Int -> a) a
  3. 现在,看看combinators,特别是</>,这是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)
  4. 基于3号。我会得出结论Parser a b表示一个解析器,它可以解析复杂的一部分a以将其简化为更简单的b
  5. 从包用户的角度来看,这是相反的。如果您使用数据类型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表示的内容,其余部分可以通过不同的分析器进一步分析。

相关问题