Как требовать нескольких интерфейсов в F #, когда параметр является типом объекта? - PullRequest
6 голосов
/ 20 июня 2019

В scala мне могут потребоваться несколько таких черт, как это:

def foo(bar: Foo with Bar): Unit = {
  // code
}

Возможно ли это и в F #, или мне нужно явно объявить интерфейс FooBar, который наследует Foo и * 1006?*

1 Ответ

10 голосов
/ 20 июня 2019

Вы можете указать это, имея общий тип 'T с ограничениями, ограничивающими 'T типами, которые реализуют требуемые интерфейсы.

Например, с учетом следующих двух интерфейсов:

type IFoo = 
  abstract Foo : int 
type IBar = 
  abstract Bar : int 

Я могу написать функцию, требующую 'T, которая равна IFoo, а также IBar:

let foo<'T when 'T :> IFoo and 'T :> IBar> (foobar:'T) = 
  foobar.Bar + foobar.Foo

Теперь я могу создать конкретный класс, реализующий оба интерфейса, и передать его моему foo функция:

type A() = 
  interface IFoo with 
    member x.Foo = 10
  interface IBar with 
    member x.Bar = 15

foo (A()) // Type checks and returns 25 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...