0

このコードはコンパイルされません:

let f = fun x y -> x <<< y // bit shift
let g = fun x y -> x <<< y

[<EntryPoint>]
let main _ =
  printfn "%d" <| f 1 10
  printfn "%d" <| f 1L 10 // error
  printfn "%d" <| g 1L 10
  0
(7,21): error FS0001: This expression was expected to have type
    int
but here has type
    int64

ユニファイヤは、関連付けられている型パラメータを修正し、最初の出現を確認したfと思います。gこのプロセスを支配するものは何ですか? これは「値の制限」に非常に似ていると思いますがfgすでに eta 拡張されています! これは難しい問題です。

事前定義された演算子を整数型に対してアドホックなポリモーフィズムで入力することの背後には、何らかの黒魔術があることは確かに想像できますが、それは単なる私の推測です。任意の情報をいただければ幸いです。

4

2 に答える 2

2

汎用数値プログラミングは、.NET 型システムでは表現できない静的メンバー制約を使用して行われます。これらは F# にのみ存在するため、マークする必要がありますinline

コードは次のように記述できます。

let inline f x y = x <<< y // bit shift
let inline g z y = z <<< y

[<EntryPoint>]
let main _ =
  printfn "%d" <| f 1 10
  printfn "%d" <| f 1L 10 // works too
  printfn "%d" <| g 1L 10
  0

MSDN の詳細:
Inline Functions
Statically Resolved Type Parameters

于 2014-10-29T14:54:57.273 に答える
1

F# が関数パラメーターの自動一般化を実行する方法だと思います。最初の出現では、関数 'f' は型 ('a -> 'a -> 'a) を持つ可能性があると推測されますが、2 回目の出現では、異なる署名 ('b -> 'a -> 'a) int64 と int を異なる型と見なすためです。

@Danielが言及したように、インライン関数はこの問題を解決することがあります

もう少し詳しい情報がここにあります: http://msdn.microsoft.com/en-us/library/dd233183.aspx

静的メンバーの制約に関する詳細情報は、Tomas Petricek によるこの投稿 ( http://tomasp.net/blog/fsharp-generic-numeric.aspx/ ) にあります。

于 2014-10-29T15:03:17.777 に答える