问题描述
我试着理解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 中。
做 SelectionSet
、Response
、RootQuery
是
最好的问候,
斯蒂芬
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 variables、number
、{{1 }}、appendable
和 comparable
)。一个更简单的示例是 Maybe
,您可以在其中使用 compappend
或 Maybe Int
。类似地,Dict
有两个类型变量(键和值),所以你可以有 Maybe String
或 Dict String String
(Dict Int MyCustomType
的键类型确实需要是 {{ 1}}).
因此,在您的场景中,Dict
对应于 comparable
,而 Response
对应于 decodesTo
。 RootQuery
有一个 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
是有道理的:它是一个函数。部分应用也称为“柯里化”。