簡體   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