如何按顺序从同一类型中查找特定的受歧视的联合,然后返回该特定的受歧视的联合(如果存在)

时间:2019-04-23 03:22:07

标签: f#

我想检查序列中是否存在特定的已区分并集的元素,如果存在,我想返回该特定元素。

 type Shape = 
   | Rectangle of float * float 
   | Circle 
   | Prism 
 let rectangle1 = Rectangle(5.0,1.2)
 let rectangle2 = Rectangle(2.0,1.4)
 let test = [Circle;Prism;rectangle2;rectangle1]

 let getShape shape = 
   match shape with
   | Rectangle(a,b) -> Some(a)
   | _ -> None


let x = 
  if test |> List.exists (fun shape -> (getShape shape) = Some(1.0)) then 
      ???
  elif test|> List.exists (fun shapre -> shape = Circle) then 
      Circle 
  else 
      Prism

对于上面的代码,我希望能够检查是否有一个矩形的元组的第一个元素为1.0的矩形

此检查有效:test |> List.exists (fun shape -> (getShape shape) = Some(1.0))

但是,我不知道如何返回从该表达式中找到的“形状”。

我希望它用于序列,但是上面的示例使用List。我想它也将适用于序列。

1 个答案:

答案 0 :(得分:1)

List.tryFind听起来像您need。也适用于Seq

在您的情况下,我认为它看起来像这样:

let x = test |> List.tryFind (fun shape -> (getShape shape) = Some(1.0))

之后,x的类型应为Shape,您仍然需要进行模式匹配以将其作为Rectangle进行操作。

Rectangle不是一种类型(尽管它可能在编译后表示为一个),而是一个值。