Сравнение предметов в списке - PullRequest
3 голосов
/ 10 января 2011

Я написал этот метод, который дал число, и список вернет новый список с номером, вставленным в список в правильной позиции на основе его значения.(Я делаю сортировку вставкой.)

let rec insertinto number numbers =
  match numbers with
  | [] -> [number]
  | head::tail -> if head > number then number::numbers else head::(insertinto number tail)

F # предполагает тип этого метода:

val insertinto : 'a -> 'a list -> 'a list when 'a : comparison

Если я тестирую этот метод с

[4; 10; 15] |> insertinto 12

Я получаю

val it : int list = [4; 12; 10; 15]

Что явно не так.Сравнение 'head> number' не работает правильно.

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

let rec insertinto number numbers: int list =

Тогда все это работает, но яЯ не хочу использовать список int все время, я хочу, чтобы это работало с любым типом списка.Пока тип реализует сравнение, он, безусловно, должен работать.

Почему это работает со списком int, а не с общим списком?Чего мне не хватает?

edit

ок, похоже, проблема только в моно.

1 Ответ

3 голосов
/ 11 января 2011

Я только что протестировал код на Mac с использованием Mono (версия 2.8) и MonoDevelop с последней интеграцией F #, и первая функция (без аннотаций типов) работает как положено.

Однако я бы не стал слишкомУдивлен, если это было ошибкой в ​​более ранней версии Mono.В 2.6.х были всевозможные проблемыДавать неверный результат - это странная ошибка (чаще встречается сообщение об ошибке или сбой), но это может быть вызвано какой-то проблемой.Можете ли вы проверить свою версию Mono?

Я использую это, и он отлично работает:

fsmac:~ tomaspetricek$ mono -V
Mono JIT compiler version 2.8 (tarball Thu Oct  7 12:23:27 MDT 2010)
Copyright (C) 2002-2010 Novell, Inc and Contributors. www.mono-project.com

Хотя вы можете запустить F # на Mono 2.6.x,Настоятельно рекомендуется использовать 2.8 (которая устраняет многие проблемы с дженериками, блокирующими для F #)

...