我已经编写了这个给出数字的方法,列表将返回一个新列表,其中的数字根据其值插入到列表中的正确位置。 (我正在进行插入排序。)
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唯一的问题。答案 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#的泛型的许多问题)