F# 如何在有区别的联合中使用符号/标点符号
我试图为自然语言解析器返回的词性标签和其他标签创建一个有区别的联合 在C#/Java中使用字符串或枚举是很常见的,但在F#中使用区分并集似乎更合适,因为它们是不同的只读值 在语言参考中,我发现这个符号F# 如何在有区别的联合中使用符号/标点符号,f#,symbols,discriminated-union,F#,Symbols,Discriminated Union,我试图为自然语言解析器返回的词性标签和其他标签创建一个有区别的联合 在C#/Java中使用字符串或枚举是很常见的,但在F#中使用区分并集似乎更合适,因为它们是不同的只读值 在语言参考中,我发现这个符号 ``...`` 可用于分隔关键字/保留字。这适用于 type ArgumentType= |A0//主题 |A1//间接宾语 |A2//直接对象 |A3/ |A4/ |A5/ |AA/ |`AM-ADV`` 但是,标记包含$等符号,例如 type PosTag= |CC//并列连词 |CD//
``...``
可用于分隔关键字/保留字。这适用于
type ArgumentType=
|A0//主题
|A1//间接宾语
|A2//直接对象
|A3/
|A4/
|A5/
|AA/
|`AM-ADV``
但是,标记包含$等符号,例如
type PosTag=
|CC//并列连词
|CD//基数
|DT//限定符
|EX//Existential there
|FW//外来词
|在//介词或从属连词中
|JJ//形容词
|JJR//形容词,比较级
|JJS//形容词,最高级
|LS//列表项标记
|MD//Modal
|NN//名词,单数或质量
|NNP//专有名词,单数
|NNPS//专有名词,复数
|NNS//名词,复数
|PDT//Predeterminer
|POS//所有格结尾
|PRP//人称代词
|PRP$/$所有格代词
|RB//副词
|RBR//副词,比较级
|RBS//副词,最高级
|RP//Particle
|符号//符号
|TO//TO
|呃//感叹词
|VB//动词,基本形式
|VBD//动词,过去时
|VBG//动词、动名词或分词
|VBN//动词,过去分词
|VBP//动词,非第三人称单数present
|VBZ//动词,第三人称单数present
|WDT//Wh限定词
|WP//Wh代词
|WP$/$所有格wh代词
|WRB//Wh副词
|``#`
|`$``
|````
|``(`
|``)`
|``,`
|`.`
|``:`
|``//不确定如何对此进行转义/分隔
``...``
不适用于WP$或类似符号(
另外,我还有一个有趣的问题,解析器返回``作为一个有意义的符号,因此我也需要对它进行转义
是否有其他方法可以做到这一点,或者这仅仅是不可能的歧视性联盟
现在我遇到了这样的错误
- 无效的命名空间、模块、类型或联合案例名称
- 区分的联合大小写和异常标签必须是大写标识符
我想我可以用某种方式覆盖这些愚蠢的情况下的toString,并用一些字母数字等效物替换符号?规范似乎不清楚在什么上下文中允许双倒勾转义哪些字符
我认为您最好的选择是对DU案例使用标准标识符,并按照您的建议覆盖
ToString
。根据我的经验,双反勾号标识符似乎只在let绑定或类型成员中得到完全支持。因此,这意味着您可以在其中放置任意字符序列(为F#codegen保留的@
字符除外)
当您想在模块、类型或DU案例定义中使用它们作为标识符时,由于某些字符不受支持,所以它不会起到很好的作用
例如,
,/
,*
,+
,$
,[
,]
,\
或&
生成一个“无效的名称空间、模块、类型或联合案例名称”错误。为什么不简单地使用适合的命名约定,而不使用解析器中的文字?