# Thinking Functionally: Introduction

Now that you have seen some of the power of F# in the "why use F#" series, we're going to step back and look at the fundamentals of functional programming -- what does it really mean to "program functionally", and how this approach is different from object oriented or imperative programming.

### Changing the way you think

It is important to understand that functional programming is not just a stylistic difference; it is a completely different way of thinking about programming, in the way that truly object-oriented programming (in Smalltalk say) is also a different way of thinking from a traditional imperative language such as C.

F# does allow non-functional styles, and it is tempting to retain the habits you already are familiar with. You could just use F# in a non-functional way without really changing your mindset, and not realize what you are missing. To get the most out of F#, and to be fluent and comfortable with functional programming in general, it is critical that you think functionally, not imperatively. And that is the goal of this series: to help you understand functional programming in a deep way, and help to change the way you think.

This will be a quite abstract series, although I will use lots of short code examples to demonstrate the points. We will cover the following points:

• Mathematical functions. The first post introduces the mathematical ideas behind functional languages, and the benefits that come from this approach.
• Functions and values. The next post introduces functions and values, showing how "values" are different from variables, and why there are similarities between function and simple values.
• Types. Then we move on to the basic types that work with functions: primitive types such as string and int; the unit type, function types, and generic types.
• Functions with multiple parameters. Next, I explain the concepts of "currying" and "partial application". This is where your brain can start to hurt, if you are coming from an imperative background!
• Defining functions. Then some posts devoted to the many different ways to define and combine functions.
• Function signatures. Then a important post on the critical topic of function signatures: what they mean and how to use them as an aid to understanding.
• Organizing functions. Once you know how to create functions, how can you organize them to make them available to the rest of your code?