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