ápr
25

F# kezdetek III.

Címkék: option match yield f# seq | Szerző: sync | 1:13 pm

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"));;

  

 

 

 

 

A bejegyzés trackback címe:

https://fsharpmagyarul.blog.hu/api/trackback/id/tr891085597

Kommentek:

A hozzászólások a vonatkozó jogszabályok  értelmében felhasználói tartalomnak minősülnek, értük a szolgáltatás technikai  üzemeltetője semmilyen felelősséget nem vállal, azokat nem ellenőrzi. Kifogás esetén forduljon a blog szerkesztőjéhez. Részletek a  Felhasználási feltételekben és az adatvédelmi tájékoztatóban.

Nincsenek hozzászólások.
süti beállítások módosítása