F#函数的通用版本导致IL无效?

时间:2011-01-02 05:14:55

标签: f# mono generics il

所以我编写了一个小的二进制搜索函数(不是我需要的,但只是因为我可以),并且当我使它特定于字符串或整数时,例如,它运行良好。当我尝试使用泛型类型签名时,我开始获得异常。

使用泛型类型'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

我做错了吗? (同样,当我使用stringint代替'a时,一切正常......)

修改

我编译了Mono 2.9左右,然后这个功能在FSI中运行。现在,等待Debian和Ubuntu升级......:D

2 个答案:

答案 0 :(得分:2)

这对我有用(在.NET 4.0上运行FSI)。也许这是一个单声道的错误?

答案 1 :(得分:2)

Mono bug。 以前,我有一个代码在fsi上不起作用,但编译工作。

编辑:已确认该代码无法在fsi上运行,但可以使用fsc编译。