Чтобы убедиться, что наши функции используют сокращенные типы intead примитивов в F #, кроме того, что всегда должны писать это сами? - PullRequest
5 голосов
/ 12 сентября 2011

Допустим, я определил некоторое сокращение типа

type Individual = Double array

и что я использую его во всем проекте F #:

let generateIndividual = [|1.0; 2.0|]

IntelliSense сообщает мне, что generateIndividual имеет связанный тип возврата float[]. Поскольку я предпочел бы, чтобы в качестве возвращаемого типа отображался Individual, я изменяю его подпись на

let generateIndividual : Individual = [|1.0; 2.0|]

При использовании внутреннего кода на самом деле не так важно, что показывает Intellisense. Но когда я выполняю API-интерфейсы, которые будут использоваться для внешнего мира, мне кажется более привлекательным, чтобы мои функции отображали псевдонимы, а не примитивные типы.

Есть ли случайно какой-либо способ избежать их набора, кроме как способом, показанным выше? По предложению Свенсена я взглянул на файлы сигнатур, и хотя сначала они казались именно тем, что я искал, они, похоже, не могли этого сделать.

1 Ответ

5 голосов
/ 12 сентября 2011

Псевдонимы типа, такие как Individual, видны только в F #, если вы используете явные аннотации для пометки значений (или аргументов и результатов функций) с типом. Во время компиляции псевдонимы заменяются фактическим типом (например, Double array). Это означает, что F # обрабатывает оба типа как один и тот же тип, и нет никакого способа гарантировать, что вы увидите только псевдоним. Вы можете добавлять аннотации типов повсюду, но если кто-то еще использует тип, он также должен будет это сделать.

Если вы хотите убедиться, вам нужно использовать обертку. Дискриминационное объединение с одним регистром является хорошим способом сделать это, потому что их легко построить и разложить:

type Individual = Individual of Double array

// Creating single-case union
let generateIndividual = Individual [|1.0; 2.0|]  

// Decomposing single-case union
let sumIndividual (Individual data) = Array.sum data
...