Gyakran találkozni F# kódókban a Some(valamilyen kifejezés) -sel. A Some az opciós értékekkel van kapcsolatban. Az option definíciója a Discriminativ Unions tárgykörébe tartozik.:
type 'a option =
| None
| Some of 'a
azaz a definíció szerint bármely kifejezés option-je None vagy Some. Kicsit nehéz megérteni, hogy miképpen működik. Tehát, egy kifejezésnek az option-je vagy None vagy maga a kifejezés. Ez jól jön olyankor, amikor vizsgálni akarjuk, hogy egy függvény ad-e vissza valamit vagy null-lal tér vissza.
pl.
Some(89)
>val it : int option = Some 89
Some(None)
>val it : 'a option option = Some null
A következő példában háromféle szekenciát hozok létre. Látható, hogy egy lista létrehozása is milyen rugalmas. Az első egy számlista 1-99 között, a második egy egész szám- négyzete párosokat, míg a harmadik egy string listát hoz létre a windows mappa fájljaiból. Mindhárom listát ugyanazzal a benne_van függvénnyel vizsgálhatjuk. A C#-ban sokat kellene gondolkodni egy ilyen tömör megoldáson.
Van még egy érdekes elem a lista3 definiciójában: a yield. Ha egy függvény eredménye egy nagyon nagy lista(a példában a c:\Windows fájllistája), a yield-del megakadályozzuk, hogy létrejöjjön minden elemével. A függvény végrehajtása felfüggesztődik(az állapotát megőrizve), és csak akkor folytatódik, amikor további elemekre is szükségünk van. Itt egy blog erről magyarul, C#-ban.
#light
open System
open System.IO
let lista = seq[1..99];
let lista2 = seq[for i=1 to 100 do yield (i,i*i)];
let lista3 = seq[for file in Directory.GetFiles("c:\\windows") do
yield (Path.GetFileName(file))];
A benne_van függvényben a match-csel vizsgálom, hogy a tryfind eredménye "valami" vagy "semmi".
let benne_van lista func = match lista|>Seq.tryfind(func) with
|Some(j) -> printfn "Igen, %A" j
|None -> printfn "Nincs";;
benne_van lista (fun x-> x=20)
benne_van lista2 (fun x-> snd(x)=100)
benne_van lista3 (fun x-> x.Contains(".exe"));;