我有一些JSON与我想要导入到榆树“类型”属性。例如,{ "id": "abc", "type": "thing" }
但是如果我定义与type
作为一个属性是类型别名,编译器会抱怨。例如。,
type alias Foo = {
id: String
, type: String
}
产生
It looks like the keyword `type` is being used as a variable.
3│ , type: String
^
Rename it to something else.
真的吗?我不得不重新命名的财产?难道就没有办法引用或逃避它,所以它会编译?
是的,type
是保留关键字,不能用作一个记录的字段名。
在榆树和Haskell,你的情况做最普通的事情似乎是追加单引号,因此它成为type'
,和你的类型定义变
type alias Foo =
{ id: String
, type': String
}
这有它从数学的起源prime symbol。它可能看起来很奇怪在第一,但它是有效的语法。
然后,您可以使用下面的Json解码器到JSON转化为富:
fooDecoder =
Json.object2
Foo
("id" := Json.string)
("type" := Json.string)
请注意,在榆树的确切字段名并不需要匹配的JSON字段名。
很少会找到一个语言,让您使用关键字作为变量名转义。这种行为是不是唯一的榆树。
在oscpad,我用我的WebSockets以上JSON接口“类型”字段。但我没有叫类型的榆树记录字段。我只是看的时候我解析JSON“类型”字段。我的代码如下所示:
jsSpec : JD.Decoder Spec
jsSpec =
("type" := JD.string) `JD.andThen` jsCs
jsCs : String -> JD.Decoder Spec
jsCs t =
case t of
"button" -> SvgButton.jsSpec `JD.andThen` (\a -> JD.succeed (CsButton a))
"slider" -> SvgSlider.jsSpec `JD.andThen` (\a -> JD.succeed (CsSlider a))
"label" -> SvgLabel.jsSpec `JD.andThen` (\a -> JD.succeed (CsLabel a))
"sizer" -> jsSzSpec `JD.andThen` (\a -> JD.succeed (CsSizer a))
_ -> JD.fail ("unkown type: " ++ t)
现在,您可以逃脱用下划线的关键字。
恩。
type alias Foo =
{ id: String
, type_: String
}
跑不了的。榆树是各执一词。