问题描述
我定义了几种类型,其中两种组织成列表(字段和选项)。定义函数以帮助定义条目(addfield和addoption)。我能够定义字段并按预期工作;但是,对于选项,当列表包含多个元素时,我会出错。
这是完整的dhall文件:
let FTypes = < U8 | U16 | U32 | F32 | BITS >
let Translate = List { mapKey : Text,mapValue : Text }
let Bits = < Bit0 | Bit1 | Bit2 | Bit3 | Bit4 | Bit5 | Bit6 | Bit7 >
let bits2Natural
: Bits → Natural
= λ(b : Bits) →
merge
{ Bit0 = 0,Bit1 = 1,Bit2 = 2,Bit3 = 3,Bit4 = 4,Bit5 = 5,Bit6 = 6,Bit7 = 7
}
b
let Field =
let TypeBits = { bit : Natural,width : Natural }
in { Type =
{ startbyte : Natural,type : FTypes,translate : Optional Translate,typebits : Optional TypeBits
},default = { translate = None Translate,typebits = None TypeBits }
}
let FieldList = List { mapKey : Text,mapValue : Field.Type }
let Option = { dlc : Natural,fields : FieldList,telemjson : Optional Text }
let OptionList = List { mapKey : Text,mapValue : Option }
let addfield = λ(n : Text) → λ(f : Field.Type) → { mapKey = n,mapValue = f }
let addoption = λ(k : Text) → λ(v : Option) → { mapKey = k,mapValue = v }
let testoption : OptionList =
[ addoption "0"
{ dlc = 4,fields =
[ addfield "field0" Field::{startbyte = 1,type = FTypes.U16 },addfield "field1" Field::{startbyte = 3,type = FTypes.U8 }
],telemjson = Some
( "{\"sensor1\":{"
++ "\"time\":\"@(timestamp)\","
++ "\"id\":\"@(option)\","
++ "\"temp\":@(field0.value),"
++ "\"unit\":\"@(field1.value)\""
++ "}}"
)
},addoption "1"
{ dlc = 2,fields = [ addfield "field0" Field::{startbyte = 1,type FTypes.U8 } ],telemjson = Some
("{\"sensor2\":{\"value\":@(field1.value)}}")
}
]
in testoption
Error: Invalid input
trial2.dhall:60:9:
|
60 | { dlc = 2
| ^
unexpected '{'
expecting ',',->,:,],or whitespace
如果我删除第二个选项(第59-64行),它将起作用吗?
我在做什么错?如何为Option
定义多个OptionList
。
解决方法
解析错误可能会有所改善,但是由于此处缺少=
符号,因此记录在第60行开始出现错字:
,fields = [ addfield "field0" Field::{startbyte = 1,type FTypes.U8 } ]
↑
应该是:
,type = FTypes.U8 } ]
...,如果进行了更改,则文件将成功解析并进行类型检查。