我在F#制作了扫描仪。目前,它返回一组带有类型(Token,string)的元组列表。
理想情况下,我想返回可能包含不同类型的元组列表。例如:
(Token, string)
//if it's an identifier
(Token, float)
//if it's a float.
(Token, int)
//etc
所以,基本上我想返回类型(Token, _)
,但我不知道如何指定它。现在它只是抱怨错误类型的错误。我正在浏览我的书和wikibooks,但我不确定这是什么。
如果这真的不可能,我想我可以稍后转换类型,但我希望我能以这种方式返回东西。
答案 0 :(得分:12)
在F#中有两种相对简单的方法可以解决这个问题。一个是创建一个有区别的联盟:
type Expression =
| Identifier of string
| FloatValue of float
| IntValue of int
| ...
然后定义您的函数,使其返回(Token * Expression) list
。另一种可能性是将所有内容放入对象中,然后返回(Token * obj) list
。这对于列表的制作者来说稍微容易一些,但对消费者来说更烦人。
答案 1 :(得分:4)
我认为使用歧视联盟作为kvb建议是要走的路。只是为了添加更多信息,在F#中编写扫描程序时,通常会定义一个令牌类型Token
,列出可能带有这样的附加信息的各种类型的令牌:
type Token =
// Some toknes with no additional information
| LParen | RParen | Begin | End
// Some tokens with additional values
| Identifier of string
| IntValue of int
| ...
然后,您完全取消了与令牌分开表示值的需要,您可以只使用Token list
。
答案 2 :(得分:1)
作为以前答案的补充,请查看Choice类型(以及Choice1of3等选择案例)。