Кортежи в членах типа с использованием F#

У меня простой вопрос. Почему это не работает?

type Test1() =
  member o.toTuple = 1.,2.,3.

type Test2() =
  member o.test (x: float, y: float, z: float) = printfn "test"
  member o.test (x: Test1) = o.test x.toTuple

Ошибка:

Несоответствие ограничения типа. Тип float * float * float несовместим с типом Test1 Тип float * float * float несовместим с типом Test1

а также

Тип float * float * float несовместим с типом Test1.


person Oldrich Svec    schedule 07.01.2011    source источник


Ответы (2)


Это не работает, потому что первый тест члена рассматривается как метод с несколькими аргументами в случае перегрузки. Если вам нужен кортеж, вам нужно добавить дополнительные скобки:

type Test2() =
    member o.test ((x: float, y: float, z: float)) = printfn "test"
    member o.test (x: Test1) = o.test x.toTuple

См. объяснение Дона Сайма здесь.

Обратите внимание, что если вы не хотите добавлять дополнительные скобки, вы все равно можете разобрать кортеж и использовать вызов с несколькими аргументами:

type Test2() =
    member o.test (x: float, y: float, z: float) = printfn "test"
    member o.test (x: Test1) = let a,b,c = x.toTuple in o.test(a,b,c)
person Stringer    schedule 07.01.2011

Переименуйте свой первый метод в Type2 во что-то отличное от test. Второй метод затеняет ваш первый и, таким образом, сбивает с толку компилятор.

type Test1() =
   member o.toTuple = 1.,2.,3.

type Test2() =
  member o.print (x: float, y: float, z: float) = printfn "test"
  member o.test (x: Test1) = o.print x.toTuple
person pblasucci    schedule 07.01.2011