2009-07-30 12 views
2

まず、この問題に対処するより良い方法がありますので問題はありません。F#:奇数型推論の振る舞い

しかし、それは私が理解できないものです。誰かがこれを説明できますか?

として、私はスワップ機能を定義します。私はこれだけで罰金のようなスワップ機能を使用することができる午前

namespace Utilities 
module Misc 

let Swap (left : 'a byref) (right : 'a byref) = 
    let temp = left 
    left <- right 
    right <- temp 

Misc.Swap (&s.[i]) (&s.[j]) 

しかし、私はのようなモジュールを定義する場合:

namespace Utilities 

type Misc = 
    static member Swap (left : 'a byref) (right : 'a byref) = 
     let temp = left 
     left <- right 
     right <- temp 

私は両方の引数に次のエラーを取得:

移動することで、呼び出し側の引数の変更のための型推論をどうやっ
This expression has type 'b byref but is here used with type 'a ref 

型に関数?

+0

感謝を。部分的なアプリケーションがbyrefをキャプチャしようとし、それがうまくないので、 'byref'カドミウムパラメータの使用を禁止するように言語仕様を変更する可能性があります。 :) – Brian

答えて

2

これは、F#コンパイラがクラスメソッドに対して実行するタプル変換との相互作用である可能性があります。私たちは、コンパイラがtupledフォームにカリー引数を変換したことをここで見ることができます

public static void Swap<a>(ref a left, ref a right); 

リフレクターとしてMisc.Swapの種類を報告します。 tupled引数を持つメソッドを定義する

は、この問題を回避:この質問のための

type Misc = 
    static member Swap(left : 'a byref, right : 'a byref) = 
     let temp = left 
     left <- right 
     right <- temp  

> let s = Array.init 3 (fun i -> i) 
> val s : int array = [|0; 1; 2|] 
> Misc.Swap (&s.[2], &s.[0]) 
> s;; 
> val s : int array = [|2; 1; 0|] 
+0

その後、タプルargを持つ元の問題タイプを呼び出すことはできませんか? – telesphore4

+0

私はあなたが電話できるようにしたいと思っているかどうか分かりません。より具体的になりますか?ありがとう。 –

+0

私は実際に最初の作業バージョンを使用しています。私はちょうど物事が合わない理由を理解しようとしています – telesphore4