Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

F# Functions vs. Values

Tags:

f#

This is a pretty simple question, and I just wanted to check that what I'm doing and how I'm interpreting the F# makes sense. If I have the statement

let printRandom = 
  x = MyApplication.getRandom()
  printfn "%d" x
  x

Instead of creating printRandom as a function, F# runs it once and then assigns it a value. So, now, when I call printRandom, instead of getting a new random value and printing it, I simply get whatever was returned the first time. I can get around this my defining it as such:

let printRandom() = 
  x = MyApplication.getRandom()
  printfn "%d" x
  x

Is this the proper way to draw this distinction between parameter-less functions and values? This seems less than ideal to me. Does it have consequences in currying, composition, etc?

like image 304
Perrako Avatar asked Aug 24 '10 08:08

Perrako


1 Answers

The right way to look at this is that F# has no such thing as parameter-less functions. All functions have to take a parameter, but sometimes you don't care what it is, so you use () (the singleton value of type unit). You could also make a function like this:

let printRandom unused = 
  x = MyApplication.getRandom()
  printfn "%d" x
  x

or this:

let printRandom _ = 
  x = MyApplication.getRandom()
  printfn "%d" x
  x

But () is the default way to express that you don't use the parameter. It expresses that fact to the caller, because the type is unit -> int not 'a -> int; as well as to the reader, because the call site is printRandom () not printRandom "unused".

Currying and composition do in fact rely on the fact that all functions take one parameter and return one value.

The most common way to write calls with unit, by the way, is with a space, especially in the non .NET relatives of F# like Caml, SML and Haskell. That's because () is a singleton value, not a syntactic thing like it is in C#.

like image 59
Nathan Shively-Sanders Avatar answered Sep 19 '22 20:09

Nathan Shively-Sanders