2011-01-02 6 views
4

私は少しバイナリの検索機能を書いています(私が必要とするものではありませんが、できる限り)。文字列や整数に固有のものを作成すると、うまくいきます。ジェネリック型のシグネチャを使用しようとすると、例外が発生します。これが呼び出されるとF#関数の汎用バージョンが無効なILを引き起こしていますか?

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 

、私は以下の取得:

ジェネリック型を使用して、関数のコピー、'a

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>[email protected]() [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 

私が何か間違ったことをやっていますか? (私が代わりに'astringまたはintを使用する際に再び、すべてが...作品)

編集:

私はモノ2.9かそこらをコンパイルした、とこの機能は、FSIで動作します。 DebianとUbuntuがアップグレードするのを待つために:D

+1

Monoのどのバージョンをお使いですか?同じように見えるいくつかのバグは、Mono 2.8で修正されました... –

+0

バージョン2.6.7 ...(現在も、Ubuntu 11.04には2.6.7が含まれていますが、明らかに私は10.10です)Hmmmmm。 –

答えて

2

モノバグ。 前に、fsiで動作しないコードがありましたが、コンパイルされています。

編集:そのコードはfsiで機能しませんが、fscでコンパイルされていることが確認されています。

+0

ええ、はい、RunメニューからMonoDevelopを実行すると 'fsc'を使う必要があります。 –

+0

今、バグレポートを提出する場所を探しています... –

+0

http:// mono- project.com/Bugs。言及するべき事は、バグがMonoコンパイラ自体ではなく "Reflection.Emit"(fsiが使用するパス)にあることです。 –

2

これは私のために働きます(.NET 4.0上でFSIを実行しています)。 Monoバグでしょうか?

関連する問題