универсальная версия функции F # вызывает недействительный IL? - PullRequest
4 голосов
/ 02 января 2011

Итак, я написал небольшую функцию двоичного поиска (не то, что мне нужно, а просто потому, что я могу), и когда я делаю ее специфичной, например, для строк или целых чисел, она работает хорошо. Когда я пытаюсь использовать сигнатуру общего типа, я начинаю получать исключения.

Копия функции с использованием универсального типа, '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, все работает ...)

Edit:

Я скомпилировал Mono 2.9 или около того, и эта функция затем работает в FSI. Теперь дождемся обновления Debian и Ubuntu ...: D

Ответы [ 2 ]

2 голосов
/ 02 января 2011

Моно ошибка. Раньше у меня был код, который не работает на fsi, но работает скомпилировано.

РЕДАКТИРОВАТЬ: Подтверждено, что этот код не работает на fsi, но работает с скомпилированным fsc.

2 голосов
/ 02 января 2011

Это работает для меня (работает FSI на .NET 4.0).Возможно, это ошибка Mono?

...