Массивы float, float [] и double [] различны или одинаковы? - PullRequest
7 голосов
/ 09 марта 2010

Я пишу свой код так, как будто это все одно и то же, и у меня нет проблем, но меня начинает смущать, когда я наводю курсор на функцию в Visual Studio и вижу, что определения типов содержат 3 разных типа, которые я думал, что все были одинаковыми. Они одинаковы? Или они разные?

Ответы [ 2 ]

12 голосов
/ 09 марта 2010

Они одинаковы. См. Сокращения типов в нижней части документации FSharp.Core . float = double = System.Double и array<'T> = 'T[]. Вы также можете определить свои собственные сокращения типов и использовать их таким же образом:

type dbl = double
let (d:dbl) = 1.0

Вы не спрашивали об этом, но обратите внимание, что единственное место, где сокращения типов могут работать не совсем так, как вы ожидаете, это типы показателей; float<_> определяется независимо от float, double и System.Double, и нет такого понятия, как double<_> или System.Double<_>.

7 голосов
/ 10 марта 2010

Помимо сокращений типов, есть две полезные вещи, которые нужно знать о типах F #. Прежде всего, есть два способа написания имен универсальных типов. Одним из способов является использование синтаксиса OCaml, а вторым - использование синтаксиса .NET:

  • При использовании синтаксиса .NET вы пишете array<'T> или, например, OtherType<'T1, 'T2> (для типов с более чем одним параметром универсального типа).
  • В синтаксисе OCaml то же самое записывается как 'T array или ('T1, 'T2) OtherType

Эти две нотации эквивалентны - когда вы объявляете значение, аннотированное с использованием синтаксиса .NET, вы можете присвоить его значению, аннотированному с использованием синтаксиса OCaml. 'T[] - это специальные обозначения для массивов, но это объясняет, почему array<'T> совпадает с 'T array.

Во-вторых, F # использует немного неудачное именование для типов чисел с плавающей запятой. Вероятно, это связано с совместимостью с OCaml, но это может запутать программистов .NET:

  • F # тип float соответствует System.Double в .NET (который называется double в C #)
  • F # тип float32 соответствует System.Single в .NET (который называется float в C #)

Как указывает @kvb, double - это псевдоним другого типа для System.Double типа.

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