Likheter mellom F# og Erlang


fredag 18. november 2011 Erlang F# Pattern matching

Jeg hadde meg en tur innom bloggen til Christian Abildsø a.k.a. @mcmuttons i dag, og oppdaget en blogpost han skrev for halvannet år siden om å gjøre bowling kata i F#. Og jeg synes koden han kom opp med var så vakker at jeg nesten bare måtte dele det.

Her bruker Christian patter matching til å beregne poengene for et sett med bowlingkast.

10 module Scorer
11 
12 let rec CalculateFrame rolls frame =
13     match rolls with
14         | _ when frame = 10         -> 0
15         | 10::y::z::rest            -> 10+y+z + CalculateFrame (y::z::rest) (frame+1)
16         | x::y::z::rest when x+y=10 -> 10+z   + CalculateFrame (z::rest)    (frame+1)
17         | x::y::rest                -> x+y    + CalculateFrame rest         (frame+1)
18         | _                         -> 0
19 
20 let CalculateScore rolls =
21     CalculateFrame rolls 0

Dette fikk meg til å se hvor kort avstand det kan være fra F# til et språk jeg selv har jobbet endel med, nemlig Erlang. Jeg har blogget om pattern matching i Erlang tidligere, og her kan du se hvordan Christians algoritme ville sett ut:

10 -module(scorer).
11 -export([calculate_score/1]).
12 
13 calculate_frame(Rolls, Frame) ->
14   case Rolls of
15     _ when Frame == 10        -> 0;
16     [10,Y,Z|Rest]             -> 10+Y+Z + calculate_frame([Y,Z|Rest], Frame+1);
17     [X,Y,Z|Rest] when X+Y==10 -> 10+Z   + calculate_frame([Z|Rest], Frame+1);
18     [X,Y|Rest]                -> X+Y    + calculate_frame(Rest, Frame+1);
19     _                         -> 0
20   end.
21 
22 calculate_score(Rolls) ->
23   calculate_frame(Rolls, 0).

Noen små syntaksforskjeller er det jo, men ellers er det jo det samme. Desverre, får jeg vel nesten si, er det F#-versjonen som har flest estetiske kvaliteter.

Det var det hele. Årets korteste blogpost fra denne kanten? :D


comments powered by Disqus