Tipi Option
Në gjuhët e programimit (veçanërisht në gjuhët e programimit funksional ) dhe në teorinë e tipeve, një lloj Option ose tipi ndoshta është një lloj polimorfik që përfaqëson kapsulimin e një vlere opsionale; p.sh., përdoret si lloj i kthimit të funksioneve të cilat mund ose nuk mund të kthejnë një vlerë kuptimplote kur zbatohen. Ai përbëhet nga një konstruktor i cili ose është bosh (shpesh i quajtur None
ose Nothing
), ose i cili përmbledh tipin origjinal të të dhënave A
(shpesh shkruhet Just A
ose Some A
).
Një koncept i veçantë, por i lidhur jashtë programimit funksional, i cili është i popullarizuar në programimin e orientuar nga objekti, quhet tipe të nulifikueshme (shpesh të shprehur si A?
). Dallimi thelbësor midis llojeve të opsioneve dhe llojeve të zhvlerësueshme është se llojet e opsioneve mbështesin folezimin (p.sh. Maybe (Maybe String)
≠ Maybe String
), ndërsa llojet e nulifikueshme jo (p.sh. String??
= String?
).
Aspekte teorike
[Redakto | Redakto nëpërmjet kodit]Në teorinë e tipeve, mund të shkruhet si: . Kjo shpreh faktin se për një bashkësi të caktuar vlerash në , një lloj opsioni shton saktësisht një vlerë shtesë (vlerën boshe) në grupin e vlerave të vlefshme për . Kjo reflektohet në programim nga fakti se në gjuhët që kanë unione të etiketuara, llojet e opsioneve mund të shprehen si bashkim i etiketuar i tipit të kapsuluar plus një lloj njësie . [1]
Lloji i opsionit është gjithashtu një monad ku: [2]
return = Just -- Mbështjell vlerën në një ndoshta
Nothing >>= f = Nothing -- Dështon nëse monadi i mëparshëm dështon
(Just x) >>= f = f x -- Sukseson nëse monadi i mëparshëm sukseson
Natyra monadike e llojit të opsionit është e dobishme për gjurmimin efikas të dështimeve dhe gabimeve. [3]
C++
[Redakto | Redakto nëpërmjet kodit]Që nga C++17, lloji i opsionit përcaktohet në librarinë standarde si template<typename T> std::optional<T>
.
let showValue =
Option.fold (fun _ x -> sprintf "The value is: %d" x) "No value"
let full = Some 42
let empty = None
showValue full |> printfn "showValue full -> %s"
showValue empty |> printfn "showValue empty -> %s"
showValue full -> The value is: 42
showValue empty -> No value
Haskell
[Redakto | Redakto nëpërmjet kodit]
Në Haskell, lloji i opsionit përcaktohet si data Maybe a = Nothing | Just a
. [4]
showValue :: Maybe Int -> String
showValue = foldl (\_ x -> "The value is: " ++ show x) "No value"
main :: IO ()
main = do
let full = Just 42
let empty = Nothing
putStrLn $ "showValue full -> " ++ showValue full
putStrLn $ "showValue empty -> " ++ showValue empty
showValue full -> The value is: 42
showValue empty -> No value
Rust
[Redakto | Redakto nëpërmjet kodit]
Në Rust, lloji i opsionit përcaktohet si enum Option<T> { None, Some(T) }
. [5]
fn show_value(opt: Option<i32>) -> String {
opt.map_or("No value".to_owned(), |x| format!("The value is: {}", x))
}
fn main() {
let full = Some(42);
let empty = None;
println!("show_value(full) -> {}", show_value(full));
println!("show_value(empty) -> {}", show_value(empty));
}
show_value(full) -> The value is: 42
show_value(empty) -> No value
Scala
[Redakto | Redakto nëpërmjet kodit]
Në Scala, lloji i opsionit përcaktohet si sealed abstract class Option[+A]
, një lloj i zgjeruar me final case class Some[+A](value: A)
dhe case object None
.
object Main:
def showValue(opt: Option[Int]): String =
opt.fold("No value")(x => s"The value is: $x")
def main(args: Array[String]): Unit =
val full = Some(42)
val empty = None
println(s"showValue(full) -> ${showValue(full)}")
println(s"showValue(empty) -> ${showValue(empty)}")
showValue(full) -> The value is: 42
showValue(empty) -> No value
Shihni gjithashtu
[Redakto | Redakto nëpërmjet kodit]- Lloji i rezultatit
- Etiketuar bashkim
- Lloji i pavlefshëm
- Modeli i objektit të pavlefshëm
- Trajtimi me përjashtim
- Përputhja e modelit
- ^ Milewski, Bartosz (2015-01-13). "Simple Algebraic Data Types". Bartosz Milewski's Programming Cafe (në anglisht). Sum types. "We could have encoded Maybe as: data Maybe a = Either () a". Arkivuar nga origjinali më 2019-08-18. Marrë më 2019-08-18.
- ^ "A Fistful of Monads - Learn You a Haskell for Great Good!". www.learnyouahaskell.com. Marrë më 2019-08-18.
{{cite web}}
: Mungon ose është bosh parametri|language=
(Ndihmë!) - ^ Hutton, Graham (25 nën 2017). "What is a Monad?". Computerphile Youtube. Arkivuar nga origjinali më 22 gusht 2024. Marrë më 18 gush 2019.
{{cite web}}
: Mungon ose është bosh parametri|language=
(Ndihmë!)Mirëmbajtja CS1: BOT: Gjendja e adresës origjinale është e panjohur (lidhja) - ^ "6 Predefined Types and Classes". www.haskell.org. Marrë më 2022-06-15.
{{cite web}}
: Mungon ose është bosh parametri|language=
(Ndihmë!) - ^ "Option in core::option - Rust". doc.rust-lang.org. 2022-05-18. Marrë më 2022-06-15.
{{cite web}}
: Mungon ose është bosh parametri|language=
(Ndihmë!)