Как найти конкретное дискриминационное объединение из того же типа в последовательности, а затем вернуть этот определенный дискриминационное объединение, если оно существует - PullRequest
0 голосов
/ 23 апреля 2019

Я хочу проверить, есть ли в последовательности элемент определенного различного объединения, и если он существует, я хочу вернуть этот конкретный элемент.

 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))

Однако я не знаю, как вернуть «форму», найденную из этого выражения.

Я хочу это для последовательности, но в приведенном выше примере используется список. Я думаю, это также будет применяться к последовательности.

1 Ответ

1 голос
/ 23 апреля 2019

List.tryFind звучит так, как вам нужно . Также для Seq .

В вашем случае я считаю, что это будет выглядеть примерно так:

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

После этого x должен иметь тип Shape, вам все равно потребуется сопоставление с образцом, чтобы работать с ним как Rectangle.

Rectangle здесь не тип (хотя он может быть представлен как один раз скомпилированный), а скорее значение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...