[英]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.