列表中项目的比较

时间:2011-01-10 16:57:11

标签: f# types mono

我已经编写了这个给出数字的方法,列表将返回一个新列表,其中的数字根据其值插入到列表中的正确位置。 (我正在进行插入排序。)

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>号码'无法正常工作。

要使其工作,我必须指定数字参数的类型:

let rec insertinto number numbers: int list =

然后一切正常,但我不想一直使用int列表,我希望这适用于任何类型的列表。只要类型实现比较,它肯定会起作用。

为什么这会使用int列表而不是通用列表?我错过了什么?

修改

好吧,这似乎是Mono唯一的问题。

1 个答案:

答案 0 :(得分:3)

我刚刚使用Mono(版本2.8)测试了Mac上的代码,使用最新的F#集成测试了MonoDevelop,第一个函数(没有类型注释)按预期工作。

但是,如果这是Mono早期版本中的错误,我不会感到惊讶。 2.6.x中存在各种问题。给出不正确的结果是奇怪的错误(更常见的是一些错误消息或崩溃),但它可能是由某些问题引起的。你能查看你的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

虽然您可以在Mono 2.6.x上运行 F#,但强烈建议使用2.8(修复了阻止F#的泛型的许多问题)