“query : SelectionSet Response RootQuery”类型注释中的正确部分是什么?

问题描述

我试着理解this line

query : SelectionSet Response RootQuery

我知道这是一个 "Type Annotations" 语法,但我没有找到有关由空格分隔的多个“单词”的文档示例或解释。

我看到了这些例子:

  • answer : Int
  • factorial : Int -> Int
  • distance : { x : Float,y : Float } -> Float
  • add : number -> number -> number (ref)

我在任何地方都找到了 query: Int Int Int 语法,既不在 Elm Syntax 中,也不在 Beginning Elm 中,也不在 Elm FAQ 中。

SelectionSetResponseRootQuery

最好的问候,
斯蒂芬


Same question on Elm Discourse


How do I read the type of a SelectionSet? 中的回复

解决方法

SelectionSet 是具有两个类型变量的类型。定义如下:

type SelectionSet decodesTo scope
    = SelectionSet (List RawField) (Decoder decodesTo)

在这样的类型声明中,类型后面的任何小写名称都是类型变量,可以用任何类型填充(除了少数特殊的constrained type variablesnumber、{{1 }}、appendablecomparable)。一个更简单的示例是 Maybe,您可以在其中使用 compappendMaybe Int。类似地,Dict 有两个类型变量(键和值),所以你可以有 Maybe StringDict String StringDict Int MyCustomType 的键类型确实需要是 {{ 1}}).

因此,在您的场景中,Dict 对应于 comparable,而 Response 对应于 decodesToRootQuery 有一个 scope 解码为 SelectionSet 值,它也携带这个 Decoder 类型变量,它不直接用于它保存的数据中.它用作类型级别的一条信息,以便您(和库)知道调用 map(类型为 Response)将保留该 scope 值;也就是说,它可以防止混合范围。

,

以上是Haskell、Elm等函数式语言的通用函数语法。

例如:

add : Int -> Int -> Int 
add x y = x + y

第一行说这是两个整数参数和一个整数返回值的函数。第二行实现了第一行给出的规范。可以这样调用这个函数:

> add 2 3
  5 

注意这个例子:

> inc = add 1
> inc 2
  3

这里的 add 1 是一个“部分应用的函数”。它的类型为 Int -> Int。在许多语言中,add 1 没有意义。但是由于函数在 Elm 中是一流的,add 1 是有道理的:它是一个函数。部分应用也称为“柯里化”。