2011-02-13 80 views
3

我在F#中制作了一个扫描器。目前它返回一串带有类型(Token,字符串)的元组列表。如何获得一个返回F#中不同类型的函数?

理想情况下,我想返回可能包含不同类型的元组列表。例如:

(Token, string) 
//if it's an identifier 

(Token, float) 
//if it's a float. 

(Token, int) 
//etc 

所以,基本上我想返回类型(Token, _),但我不知道如何指定。现在它只是抱怨错误类型的错误。我正在浏览我的书和wikibooks,但我不确定这是什么。

如果这实在是不可能的,我想我可以稍后转换类型,但我希望我可以用这种方式返回东西。

+1

你能为你的函数显示一个样本输入和所需的输出吗? – Juliet 2011-02-13 19:54:16

回答

12

在F#中有两种相对简单的方法来处理这个问题。其中之一是建立一个可识别联合:

type Expression = 
| Identifier of string 
| FloatValue of float 
| IntValue of int 
| ... 

,然后定义你的函数,以便它返回一个(Token * Expression) list。另一种可能性是把所有东西都放到一个对象中,然后返回一个(Token * obj) list。这对列表的制作者来说稍微容易一些,但对于消费者而言更令人讨厌。

+0

好吧,语法问题。我尝试这样做: 让(令牌*表达式)functionName = .... 和 (令牌*表达式)functionName = .... 尝试指定返回类型,但它抱怨两者。我只是试图在这里指定返回类型, – jeff 2011-02-13 22:05:59

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

1

作为对以前答案的补充,查看选择类型(以及选择案例,如Choice1of3等)。

相关问题