web-dev-qa-db-ja.com

f#のリストにコンテンツを追加する

私はf#で「2Dシェイプエディター」というプロジェクトを行っています。私は以前にこのプロジェクトをc#で行ったことがあるので、2つの形状を接続する方法のすべてのロジックを持っています。したがって、追加するこれらすべての形状を保持するためのリストが必要になることを私は知っています。しかし、addToListメソッドを機能させることができません。

私のShapeList:

let mutable ShapeList:List<RectangleZ> =  [RectangleZ(100,100)] 

私の追加メソッド:

let addToList (listan:List<RectangleZ>) (element:RectangleZ) = let ShapeList =     ShapeList@[element] in ShapeList
//Method to add into the ShapeList

let addToList (listan:List<RectangleZ>) (element:RectangleZ) = element::ShapeList
//Other try on adding into shapeList

shapeListに長方形を追加する必要があるボタン:

btn.Click.Add(fun _ -> new RectangleZ(500, 100) |> addToList ShapeList |>ignore |> saver)
//Button click method that should be adding the RectangleZ(500, 100) to my ShapeList

そしてもちろん私の長方形:

type RectangleZ(x:int, y:int)= 
  let mutable thisx = x
  let mutable thisy = y
  let mutable thiswidth = 50
  let mutable thisheight = 20
  let brush = new SolidBrush(Color.Black)
  member obj.x with get () = thisx and set x = thisx <- x
  member obj.y with get () = thisy and set y = thisy <- y
  member obj.width with get () = thiswidth and set width = thiswidth <- width
  member obj.height with get () = thisheight and set height = thisheight <- height
  member obj.thisColor = Color.FromArgb(167, 198, 253)
  member obj.draw(paper:Graphics) = paper.FillRectangle(brush, thisx, thisy, 50, 20)
  member obj.ShapeType = "Rectangle"

どちらのaddToList関数でも、何らかの理由で要素がリストに追加されません。私の質問はなぜですか?

14

F#のリストは不変です。これは、次のようにリストにアイテムを追加すると、次のようになります。

let newlist = elem :: tail;;

新しいリストが作成される代わりに、古いリスト(テール)は変更されません。したがって、addToList関数から新しいリストを返し、可変変数を更新する必要があります。

let addToList (listan:List<RectangleZ>) (element:RectangleZ) = element::listan
ShapeList <- addToList ShapeList newElement

あなたのコードでlet ShapeListはローカルであり、グローバルShapeList変数には影響しません。

16
Evgeny Lazin
let newList = oldList @ [newElement]
8
alerya

List.appendmutableリストとともに使用できます。以下の例は、私にとっては問題なく機能しました。

let mutable season_averages = []
for i in 0 .. n_seasons do
     season_averages  <- [i] |> List.append season_averages
printfn "Seasons Average: %A" season_averages
2
Hasan A Yousef