Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Adding stuff to a list in f#

Tags:

f#

I'm doing a project called "2D Shape editor" in f#. I have done this project in c# before so I've got all the logics for how to connect two shapes. So I know that i will need a list to hold all theese shapes that I will be adding. But I simply can't get my addToList method to work.

My ShapeList:

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

My add methods:

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

the button that should be adding rectangles to the 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

And ofcourse my rectangle:

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"

The element dosn't get added into the list for some reason in neither of my addToList functions. My Question is why?

like image 459
Jakob Danielsson Avatar asked Dec 12 '12 12:12

Jakob Danielsson


People also ask

How to add an element to a list in f#?

Operators for Working with Lists You can attach elements to a list by using the :: (cons) operator. If list1 is [2; 3; 4] , the following code creates list2 as [100; 2; 3; 4] . You can concatenate lists that have compatible types by using the @ operator, as in the following code.

How do you define a list in F#?

F# Lists Creating lists A way to create a list is to place elements in two square brackets, separated by semicolons. The elements must have the same type. It is also possible to define lists of functions, of elements of a type defined previously, of objects of a class, etc.

How to add integer to list Python?

Use the list. append() method to add integers to a list in Python, e.g. my_list. append(6) .

Are lists mutable in F#?

The List<'T> class represents a strongly typed list of objects that can be accessed by index. It is a mutable counterpart of the List class. It is similar to arrays, as it can be accessed by an index, however, unlike arrays, lists can be resized.


3 Answers

List in F# are immutable. This means that when you add item to list like this:

let newlist = elem :: tail;;

old list (tail) doesn't changes, instead of that new list created. So, you need to return new list from your addToList function and than update mutable variable:

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

In your code let ShapeList is local and doesn't affect global ShapeList variable.

like image 143
Evgeny Lazin Avatar answered Sep 28 '22 15:09

Evgeny Lazin


let newList = oldList @ [newElement]
like image 22
alerya Avatar answered Sep 28 '22 15:09

alerya


You can use List.append with mutable lists, the below example worked fine with me:

let mutable season_averages = []
for i in 0 .. n_seasons do
     season_averages  <- [i] |> List.append season_averages
printfn "Seasons Average: %A" season_averages
like image 22
Hasan A Yousef Avatar answered Sep 28 '22 17:09

Hasan A Yousef