2016-01-15 2 views
4

Например, я определяю запись как:Можно ли определить длину списка в F #?

type a = {b : float; c: int list} 

, но я уже знаю, что этот список должен быть заранее определенного размера, скажем, 2, и если список не 2 он был бы другой тип или ошибка так как он не определен таким типом.

Возможно ли определить размер списка, как это происходит на других языках, которые вы должны определить размер? В зависимости от приложения этот вопрос может быть применен к массиву.

+8

Просто потому, что разные языки используют одно и то же имя для типа, это не значит, что они одинаковы. Прямо сейчас я переводил Python в F #, и я могу заверить, что список Python не совпадает с списком F # или списком C#. Если вы пытаетесь перевести тип с одного языка на другой, сконцентрируйтесь на том, как работают функции типа, а не от имени типа. Почему бы вам не использовать кортеж? –

+1

Вы можете проверить, когда объект создан. –

+1

Вам нужна проверка типа времени компиляции или проверка времени выполнения? –

ответ

3

Может быть, вы должны использовать массив вместо списка, так как массив имеет фиксированную длину:

// create an array of length = 2, initialized with zeros. 
let cValues : int[] = Array.create 2 0 
cValues.IsFixedSize // returns true 

EDIT: Как и другие предложили, кортеж может также быть путь. Для пары (кортеж длины два) вы можете получить доступ к значениям, используя функции fst и snd. Для более длинного кортежа вы можете использовать сопоставление с образцом, как показано ниже. Если кортеж слишком длинный, чтобы сделать этот подход соответствия шаблону практичным, вам, вероятно, понадобится структура, отличная от кортежа F #. Конечно, одним из основных требований к рассмотрению является необходимость сохранения значений смешанных типов. Кортеж или запись могут хранить сочетание нескольких типов, тогда как в массиве или списке хранятся значения одного типа.

let fourTuple = (5, 10, 2, 3) 
let _,_,third,_ = fourTuple 
printfn "%d" third // displays "2" 

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

type ListOfC = {c1 : int; c2 : int} 
type a' = {b' : float; c' : ListOfC} 

Или вы можете создать новый класс, который будет отвечать вашим требованиям, начиная с сценария ниже. Конечно, это, вероятно, не будет считаться идиоматическим стилем функционального программирования. Это больше похоже на ООП.

type ListOfTwo(firstInt : int, secondInt : int) = 
    member this.First = firstInt 
    member this.Second = secondInt 

let myListOfTwo = ListOfTwo(4, 5) 
myListOfTwo.First 

type a = {b : float; c : ListOfTwo } 
+2

Просто потому, что кортежи были покрыты комментариями, это не значит, что вы не должны включать его в свой ответ. Большинство людей, использующих этот вопрос, вероятно, попадут сюда из поиска Google и потратят, может быть, одну минуту, глядя на Вопрос и принятый ответ и перейдя. Они обычно пропускают комментарии. Не смотрите на это, как на вопрос только для OP, но каждый, кто приходит сюда. Взгляните на ответы Томаса (http://stackoverflow.com/users/33518/tomas-petricek?tab=answers) для получения качественных ответов. –