Skip to content

Instantly share code, notes, and snippets.

@jdh30
Created January 28, 2017 03:34
Embed
What would you like to do?
type AccountKind = Simple | Valuable | MostValuable
type CustomerStatus =
| Unregistered
| Registered of AccountKind * Years:int
let accountFactor kind =
match kind with
| Simple -> 0.9m
| Valuable -> 0.7m
| MostValuable -> 0.5m
let loyaltyFactor years =
1m - decimal(min years 5) / 100m
let applyDiscount price status =
match status with
| Unregistered -> price
| Registered(kind, years) ->
price * accountFactor kind * loyaltyFactor years
@mdpopescu
Copy link

mdpopescu commented Nov 6, 2017

Great job with the refactoring. Seeing examples like this make me want to look into F#... but then I see this and it drives me nuts:

Registered of AccountKind * Years:int

I am really curious about the thought process of whoever came up with that, instead of the much more obvious

Registered: AccountKind, Years: int

or

Registered of AccountKind, Years of int

@kodiakcrypto
Copy link

I vote
Registered of (AccountKind, Years: int)
the same way its called later Registered(kind, years)

@kodiakcrypto
Copy link

kodiakcrypto commented Jun 29, 2020

also make
price * accountFactor kind * loyaltyFactor years
into
price * accountFactor(kind) * loyaltyFactor(years)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment