私がここで使用したい一般的なアプローチは、ケースを識別タグに労働組合の値をマッピングして、タグの結果セットが最大1つの要素を持っているかどうかを確認することです。
タグ付け機能については
let allTheSameCase (tagger: 'a -> int) (coll: #seq<'a>) =
let cases =
coll
|> Seq.map tagger
|> Set.ofSeq
Set.count cases <= 1
、あなたが手でタグを割り当てることができます。
allTheSameCase (function Number _ -> 0 | Word _ -> 1) lst
または使用リフレクション(あなたは、必要に応じて結合フラグを設定する必要があることに注意してください):
open Microsoft.FSharp.Reflection
let reflectionTagger (case: obj) =
let typ = case.GetType()
if FSharpType.IsUnion(typ)
then
let info, _ = FSharpValue.GetUnionFields(case, typ)
info.Tag
else -1 // or fail, depending what makes sense in the context.
ヒント:最初の2つが同じ場合であれば2未満のアイテムを含むリストは、そうでなければ 'true'をを返す必要があり、また、リストの末尾が' true'をを返し、最終的な結果はまた、 'true'をなければなりません。 *(ヒント2:この関数を書いた後、 'List'モジュールの関数を使って物事を少しでも活用できるかどうか検索してください)* – Sehnsucht
あなたがここに示した2つのケース以上のユニオンタイプに関する質問はありますか?私は何かが欠けていない限り、プレイにどのように多くのケースである –
@AntonSchwaighoferは、「どのように私は、リストのすべての要素が同じである知っています」と – Sehnsucht