Logo

dev-resources.site

for different kinds of informations.

Scope progression

Published at
10/18/2024
Categories
functional
fsharp
go
Author
lamg
Categories
3 categories in total
functional
open
fsharp
open
go
open
Author
4 person written this
lamg
open
Scope progression

In imperative programming, we usually have code that looks the following way:

func addOneToSlice(xs []int) []int {
  rs := make([]int, len(xs))
  for i, value := range xs {
    rs[i] = value + 1
  }
  return rs
}
Enter fullscreen mode Exit fullscreen mode

However, notice the following about the for loop:

  • Each iteration has a specific purpose, which is to add one to the current element.
  • However, each iteration has no constraint on which element it can operate.
  • Operating with xs[i+2] and rs[i+3] wouldn't fundamentally alter the structure of the code we have, while making the end result incorrect.

Compare how the same task would be done in F#:

let rec addOneToList =
  function
  | [] -> []
  | x :: xs -> x + 1 :: addOneToList xs
Enter fullscreen mode Exit fullscreen mode

Now consider the following:

  • We have a list as a function argument.
  • A list in functional languages is a linked list.
  • The efficient and standard operations on linked lists are:
    • Separating the head x from its tail xs
    • Doing something to the head x
    • Comparing the list passed as a parameter with the empty list []

Given these restrictions, adding 1 to any element y not at the head of the list would significantly alter the structure of our function.

Now compare how the computation progresses in both styles:

  • In the functional style, we create a new scope with new values, which involves making a recursive call in the example above.
  • In the imperative style, we mutate an existing value without changing the scope.

In functional style, marrying both scope with computational progress has the following consequences:

  • We avoid mutation.
  • The execution flow is explicit.
  • The structure we are dealing with becomes clear.
fsharp Article's
30 articles in total
Favicon
Learning some Fantomas AST
Favicon
Ingesting Data in F# with Aether: A Practical Guide to Using Lenses, Prisms, and Morphisms
Favicon
Suicide Boys Merch quality designed shop
Favicon
F# 9: Nullable Reference Types and Advancing Null Safety
Favicon
Unlocking High-Performance AI Computing with F#: A Comprehensive Guide
Favicon
Scope progression
Favicon
How do I register a complaint with Delhivery?
Favicon
New wallpapers every day
Favicon
F# 🤝 GTK4
Favicon
Introducing F# with Semantic Kernel: Simplifying AI App Development with the Pipeline Pattern
Favicon
Describing musical domain with F#
Favicon
Who's Your .NET Ally? - F# vs C#
Favicon
F# For Dummys - Day 13 Collections Array
Favicon
F# For Dummys - Day 12 Collections List
Favicon
Primitive Type Differentiation in F#
Favicon
Request -> Handler -> SubPub Pattern with MediatR or Raw F# code
Favicon
F# For Dummys - Day 11 Collections Tuple
Favicon
F# For Dummys - Day 9 Branching
Favicon
F# For Dummys - Day 8 Function && Pipeline
Favicon
F# For Dummys - Day 7 Operators
Favicon
F# For Dummys - Day 16 Collections Sequence
Favicon
F# For Dummys - Day 15 Collections Set
Favicon
F# For Dummys - Day 14 Collections Map
Favicon
F# For Dummys - Day 10 Loop
Favicon
F# For Dummys - Day 6 Format
Favicon
F# For Dummys - Day 5 Mutable
Favicon
F# For Dummys - Day 4 Value
Favicon
F# For Dummys - Day 3 New Program
Favicon
F# For Dummys - Day 2 Environment
Favicon
F# For Dummys - Day 0 Foreword

Featured ones: