0

Functionオブジェクトに渡す必要があるこのタイプに遭遇していJQueryAnimationOptionsます。通常、ラムダをコールバックに渡しますが、これらは互換性がないようです。FunScript リポジトリで見つけたすべてのサンプルを調べました。回避策が見つかりませんでした。

またFunction、 return ステートメントとして使用される場合、 the は実際には (何のための) インターフェイスであるとも述べていますError: Invalid use of interface type

では、この型でコールバック引数を渡す方法はFunction?

ここに画像の説明を入力

コード:

[<FunScript.JS>]
module Main

open FunScript
open FunScript.TypeScript

let sayHelloFrom (name:string) = 
    Globals.window.alert("Hello, " + name)

let jQuery (selector:string) = Globals.jQuery.Invoke selector

let main() = 
    let options = createEmpty<JQueryAnimationOptions>()
    options.duration <- 3000
    options.complete <- (fun _ -> sayHelloFrom("F#")) 
    let properties = createEmpty<Object>()
    properties.Item("opacity") <- 1
    let mainContent = jQuery "#mainContent"
    mainContent.animate(properties, options) |> ignore
    mainContent.click(fun e -> sayHelloFrom("F#") :> obj)
4

2 に答える 2

2

これは、F# と C# の間でラムダを渡す場合に予想されるように、多かれ少なかれ機能します。F# では関数をカリー化できますが、C# (および JavaScript) ではカリー化できません。したがって、ラムダを F# から C# に送信する必要がある場合は、最初に変換する必要があります。F# では、これは次のようにラムダをラップすることによって行われます。

open System.Linq
open System.Collections.Generic

let ar = [|1;2;3|]
let f = fun (x: int) (y: int) -> x + y
let acc = ar.Aggregate( System.Func<int,int,int>(f) )

実際、ほとんどの場合、F# コンパイラは型を推測できるため、次のように記述するだけで済みますSystem.Func<_,_,_>(f)。さらに、C# ラムダを期待するメソッドに F# ラムダを渡すと、コンパイラは自動的にラッピングを行います。次に、前の例は次のようになります。

let ar = [|1;2;3|]
let acc = ar.Aggregate( fun x y -> x + y )

(もちろん、この場合は慣用的な Array.reduce を使用する方がよいでしょう。これは単なる不自然な例です。)

これは、FunScript を使用して JS とやり取りする場合とまったく同じように機能します。注意する必要があるのは、F# ラムダがどのように JS に変換されるかだけです。カリー化を可能にするために、2 つ以上のパラメーターを持つラムダは次のようfun x y -> x + yになります。

function (x) {
    return function (y) {
        return x + y;
    }
}

ネイティブ JS は次の署名を期待するため、これは問題になる可能性があります: function (x, y). その場合、System.Func<_,_,_>()C# と対話するときと同様にラムダをラップする必要があります (ラムダをメソッドに渡すと、これは自動的に行われることに注意してください)。

ただし、パラメーターが 1 つだけのラムダは問題を想定していませfun x -> x*xfunction (x) { return x*x; }。その場合、それらをラップする必要はありません (ラップしても害はありません) unbox。必要に応じて F# コンパイラを緩和するために使用するだけで十分です。FunScript コンパイラはunbox最終的な JS コードを無視するため、実行時に型チェックがまったく行われないことに注意してください。

説明が明確であることを願っています。そうでない場合はコメントを追加してください。回答を編集します。

于 2015-01-07T09:39:39.087 に答える
0

気にしないで、私は解決策を見つけました、私はunboxラムダにしなければなりませんでした:

options.complete <- unbox<Function> (fun _ -> sayHelloFrom("F#"))
于 2015-01-05T10:53:17.757 に答える