Нет, невозможно передать только тег, чтобы иметь возможность отдельно обрабатывать тег и строку, вы можете определить их следующим образом:
type AnimalType = Pig | Cow | Fish
type Animal = Animal of AnimalType * string
let animals = [Animal (Pig, "Mike"); Animal (Pig, "Sarah"); Animal (Fish, "Eve"); Animal (Cow, "Laura"); Animal (Pig, "John")]
let rec filterAnimals animalType animals =
if animals = [] then
[]
else
let rest = filterAnimals animalType (List.tail animals)
match List.head animals with
| Animal (x, animal) when x = animalType -> animal::restwork
|_ -> rest
printfn "%A" (filterAnimals Pig animals)
В качестве альтернативы вы можете использовать только кортеж AnimalType * string
ОБНОВЛЕНИЕ
Что касается вашего вопроса в комментариях о том, что произойдет, если структура не всегда одинакова, вы можете использовать хитрость: вы можете сравнить тип двух размеченных союзов, поскольку каждый тег компилируется в другой подкласс.
type Animal =
| Person of string * string
| Pig of string
| Cow of string
| Fish of string
let animals = [Pig "Mike"; Pig "Sarah"; Fish "Eve"; Cow "Laura"; Pig "John"]
let rec filterAnimals animalType animals =
if animals = [] then
[]
else
let rest = filterAnimals animalType (List.tail animals)
match List.head animals with
| x when animalType.GetType() = x.GetType() -> x::rest
|_ -> rest
printfn "%A" (filterAnimals (Pig "") animals)
Но прежде чем пойти по этому пути, вы должны подумать, действительно ли вам нужно моделировать вашу проблему таким образом.
Даже если вы решите использовать эту структуру, я бы предпочел использовать встроенную функцию фильтра, см. Решение, предложенное @polkduran.
person
Gus
schedule
26.03.2014
let rec filterAnimals animalType = function | [] -> [] | animalType animal :: rest -> animal::(filterAnimals animalType rest) | _ :: rest -> rest
. - person Søren Debois   schedule 26.03.2014