tempusfugit (136) [Avatar] Offline
5.2.1 Multiple values In F# and C# (p.110)

The entire paragraph after the "F# version using tuples" code is potentially confusing as it relies on the reader recognizing "default value" as the term used in .NET specifications to refer to the value resulting from having "the value's memory initialized to all-bits-zero".

In many contexts the initialized default value is quite useless (e.g. opening a window with zero width and height) - it is highly unlikely in the real world that I want to access "num" when "succ" is false or even ignore "succ" altogether.

When I first read the paragraph, I was thinking of "defaultValue" as in:

Microsoft.Win32.Registry.GetValue :
keyName:string *
valueName:string *
-> Object

So the paragraph seemed confusing and out of context as there is no explicit "defaultValue" in the code. This was further aggravated by the discussion of the "snd" function, which clearly wasn't necessary in this case because "succ" and "num" where already neatly separated by F#'s pattern matching.

At the end of the same paragraph a "very simple function that allows us to specify the default value to use" is promised for the next chapter. However TryParse is not used beyond this chapter (5) and here a missing value is simply represented with Option.None rather than through a specified "defaultValue".
Tomas Petricek (160) [Avatar] Offline
Re: 5.2.1 Multiple values In F# and C# (Clarification)
that's a good point. When I was reading the section I also thought it sounds a bit wrong. I think it may be occasionaly useful to ignore the success flag - in some cases, 0 or false are reasonable default values. In that case it may be better to use "snd" and avoid declaring value (succ) which isn't and shouldn't be used anywhere.

Regarding the function - I guess I forgot about this when writing chapter 6. Thanks for pointing that out. I'll remove the reference, because after reading chapter 6 you should know enough to write a function like this:

let defaultParsed defaultValue (succ, value) =
...if succ then value else defaultValue

defaultParsed (-1) (Int32.TryParse(str))

Using the pipelining operator from chapter 6 you could write the same thing like this:

let n = Int32.TryParse(str) |> defaultParsed -1