Как проиндексировать свой собственный определенный тип списка в F #

Извините, если это глупый вопрос, но я новичок в f # и ничего не могу найти по этому поводу. Я работаю над школьным заданием по созданию слов скрэббл и пытаюсь определить функцию, которая извлекает значение точки конкретной комбинации (буква, значение), заданное слово и индекс буквы. Типовое слово должно быть определено как type word = (char * int) list

Я определяю тип слова и создаю слово «Hello»

type word = Word of (char * int) list

let hello = Word (['H', 4; 'E', 1; 'L', 1; 'L', 1; 'O', 2])

Как я могу получить доступ к значению точки по заданному индексу? Я знаю, что индексирование списков можно сделать с помощью some_list.[index] . Но при попытке сделать это

let squareFun (w:word) (pos:int) =
    let pair = w.[pos]
    fst pair

w.[pos] выдает ошибку

The field, constructor or member 'Item' is not defined.(39: typecheck)

Итак, как я могу получить доступ к кортежу в моем типе слова? Функция squareFun в приведенном ниже примере должна возвращать 2, так как символ 'O' в индексе 4 имеет значение 2.

squareFun hello 4

Всего 2 ответа


Вы пишете, что «типовое слово должно быть определено как type word = (char * int) list », но затем вы определяете type word = Word of (char * int) list . Увидеть разницу? Вот что доставляет вам неприятности. Если вы удалите Word of этого будет работать. Вам также нужно удалить Word из определения hello .

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

Итак, большой вопрос, конечно, таков; какая разница? Когда word определяется type word = (char * int) list , это сокращение типа . Это означает, что вы в основном даете другому типу другое имя. Новый тип будет иметь все те же члены, что и старый, а также Item , необходимый для индексации типа. Когда word определяется type word = Word of (char * int) list вместо этого, это единственный тип случай союз , который является его собственный тип ALLtogether, и , следовательно , не имеет какого - либо из основных членов типов.


Ваш тип слова не является списком. Это единый тип объединения. Поэтому вам нужно сначала разобрать его.

let (Word letters) = hello
letters.[0]

Есть идеи?

10000