繁体   English   中英

如何在F#中使用返回不同类型的函数?

[英]How can I have a function that returns different types in F#?

我用F#制作了扫描仪。 目前,它返回一组带有类型(Token,string)的元组列表。

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

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

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

(Token, int)
//etc

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

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

在F#中有两种相对简单的方法可以解决这个问题。 一个是创建一个受歧视的联盟:

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

然后定义您的函数,以便它返回一个(Token * Expression) list 另一种可能性是将所有内容放入对象中,然后返回(Token * obj) list 这对于列表的制作者来说稍微容易一些,但对于消费者来说更烦人。

我认为使用歧视联盟作为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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM