F # наследует каждый тип от Object?

Вопрос прост и. хотя явный ответ, мне пришлось столкнуться с странной ситуацией, когда фшарп сказал мне что-то странное. Вот история:

Вопрос: автоматически ли F # каждый тип наследует класс Object? Я полагаю, ДА, и я уверен в этом, потому что было бы так много осложнений, если бы это было не так.

Но вот факт. Я писал этот фрагмент кода:

type MyType =
   val myval: int
   override self.ToString = "Hello MyType"

Ну, компилятор fsharp сказал мне, что неправильно использовать overrid, потому что он не находит какой-либо метод под названием ToString для переопределения. Я так скомпилировал этот код:

type MyType =
   val myval: int
   member self.ToString = "Hello MyType"

И все сработало нормально. mmmmmm Что происходит??? Разве FSharp не должен наследовать каждый объект из Object?

Ответы

Ответ 1

Ты забыл парсеры:

type MyType =
   val myval: int
   override self.ToString() = "Hello MyType"

В исходном коде с отсутствием parens вы пытались переопределить свойство ToString.

Ответ 2

Desco уже объяснил этот пробник своим фрагментом.

F # ведет себя точно так же, как и С#, а это означает, что все типы наследуются от Object, хотя и с немного тонким поведением типов значений. Когда у вас есть переменная типа значения, она не может быть непосредственно обработана как Object и должна быть помещена в бокс (к типу ссылок .NET, который наследует от Object).

Это может вызвать некоторые запутывающие ошибки с типом вывода:

let foo x = 
  match x with 
  | :? System.Random as rnd -> rnd.Next()
  | _ -> 0

Когда вы пишете это, вы получите сообщение об ошибке:

error FS0008: Это принуждение или тест типа времени выполнения от типа "a to Random" включает неопределенный тип на основе информации до этой точки программы. Тестирование типа времени выполнения не допускается для некоторых типов. Необходимы дополнительные аннотации типов.

Если все унаследовано от Object в строгом смысле, то компилятор F # должен иметь возможность преобразовать любой параметр типа в Object, но это не разрешено. Проблема в том, что типы значений нуждаются в боксе, поэтому вам нужно написать match box x with ....