2017-07-17 10 views
2

このエラーについては説明できません(F#4.1、VS 2017)。F#継承されたコンストラクタの継承されたプロパティ値を代入するパラメータリスト

共通コード:

open Eto.Forms 

type MyCommand() as this = 
    inherit Eto.Forms.Command() 
    do 
     this.MenuText <- "C&lick Me, Command" 
     this.ToolBarText <- "Click Me" 
     this.ToolTip <- "This shows a dialog for no reason" 
     this.Shortcut <- Application.Instance.CommonModifier ||| Keys.M 

次の宣言は、F#のエディタによって受け付けられません。メニューの初期化中に検出されたエラーメッセージは、「名前付き引数は、他のすべての引数の後に現れなければなりません」されています

type MyForm1() = 
    inherit Eto.Forms.Form(
     Title = "Eto Tests" 
     , ClientSize = Eto.Drawing.Size(600, 400) 
     , Menu = seq {yield new MyCommand()} |> Seq.fold (fun (mb:MenuBar) c -> mb.Items.Add(c) |> ignore; mb) (new MenuBar()) 
    ) 

次の宣言ではなく、エラーなしで動作します:事前に

type MyForm1() = 
    inherit Eto.Forms.Form(
     Title = "Eto Tests" 
     , ClientSize = Eto.Drawing.Size(600, 400) 
     , Menu = let m = seq {yield new MyCommand()} |> Seq.fold (fun (mb:MenuBar) c -> mb.Items.Add(c) |> ignore; mb) (new MenuBar()) in m 
    ) 

感謝を。

+3

「let m = ... in ...」の構文は、ここでは一対の括弧のように動作します。あなたのコードで '' Menu =(seq {yield ...(new MenuBar())) ''を使ってみてください。 – dumetrulo

答えて

4

パラメータ値の特定の文字のように見えますが、パーサーを切り詰めると、全体として比較(つまりx = y)として解析されます。これはブール値なので、名前のないパラメータの値である必要があるとみなします。エラー。

私は、任意のF#の仕様では、このの言及が、私の実験はこれまでに怒ら文字のリストは、(これらに限定されていない)ことを明らかにした<>$、および&見つけることができませんでした。プラス記号+と中括弧{ }はリストにありません。

type T = T with static member M(x: int, y: bool, z: int seq) =() 
let inline ($) a b = a + b 

T.M(
    y = true, z = [], 
    x = 5 $ 4 // Fails 
) 

T.M(
    y = true, z = [], 
    x = 5 + 4 // Works 
) 

T.M(
    y = true, x = 5, 
    z = seq { yield 5 } // Works 
) 

T.M(
    y = true, z = [], 
    x = seq { yield 5 } |> Seq.head // Fails due to the `>` symbol in the pipe 
) 


T.M(
    x = 5, z = [], 
    y = 4 < 3 // Fails 
) 

T.M(
    x = 5, z = [], 
    y = true & false // Fails 
) 

幸運にも回避策があります。値全体をかっこで囲みます。これは、パーサーが値がどこにあるかを正しく判別するのに役立ちます。

関連する問題