所以我写了一个小二进制搜索函数(不是我需要的,只是因为我可以),并且当我使它特定于字符串或整数时,例如,它运行良好。当我尝试使用泛型类型签名时,我开始收到异常。
使用泛型类型的函数副本,'a
:
let search (needle : 'a) (haystack: 'a array) : int =
let length = Array.length haystack
if Array.length haystack <= 0
then -1
else
let bottom = 0
let top = Array.length haystack - 1
let rec search' (needle : 'a) (haystack: 'a array) (bottom:int) (top:int) : int =
if bottom = top
then if needle = haystack.[top] then top else -1
else
let middle = (uint32 top + uint32 bottom) >>> 1 |> int // avoid an overflow
if needle <= haystack.[middle]
then search' needle haystack bottom middle
else search' needle haystack (middle+1) top
search' needle haystack bottom top
当它被调用时,我得到以下信息:
System.InvalidProgramException: Invalid IL code in FSI_0019:search'@921-13<a> (a,a[],int,int): IL_0000: br IL_0005
at FSI_0019.search[String] (System.String needle, System.String[] haystack) [0x00000] in <filename unknown>:0
at <StartupCode$FSI_0023>.$FSI_0023.main@ () [0x00000] in <filename unknown>:0
at (wrapper managed-to-native) System.Reflection.MonoMethod:InternalInvoke (object,object[],System.Exception&)
at System.Reflection.MonoMethod.Invoke (System.Object obj, BindingFlags invokeAttr, System.Reflection.Binder binder, System.Object[] parameters, System.Globalization.CultureInfo culture) [0x00000] in <filename unknown>:0
Stopped due to error
难道我做错了什么? (同样,当我使用
string
或 int
而不是 'a
时,一切正常......)编辑:
我已经编译了 Mono 2.9 左右,然后这个函数在 FSI 中工作。现在,等待 Debian 和 Ubuntu 升级... :D
最佳答案
这对我有用(在 .NET 4.0 上运行 FSI)。也许这是一个 Mono 错误?
关于f# - F# 函数的通用版本导致无效的 IL?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4577251/