Tak Lean to rieši po svojom. Chlapík to tu vysvetľuje. (Ale píše, že si nie je stopercentne istý.)
Lean nemodifikuje pôvodné pole, ale zahodí ho a na jeho mieste v pamäti sa nejako šikovne vytvorí nové, modifikované pole.
def main : IO Unit := do let a := Array.mk [1, 2, 3, 4, 5] -- makes a copy of a (since a is still referenced) -- and modifies element in position 3 let b := a.set! 3 44 let b := b.set! 4 55 -- modifies b in-place println! a println! b
Funguje to vtedy, ak na oboch stranách priradenia je rovnaké pole.
Tak immutable arrays sú už predbežne schválené, vybrali si už aj syntax [: :]. F# rieši dilemu tak, že má čisté API a nečisté API, pričom to východzie je immutable, napr. Array.InsertAt. Ak sa má pole modifikovať, tak je tam explicitne uvedený úmysel, Array.sort vs Array.sortInPlace. (Nejako podobne rieši Python privátne importy.)
Clojure to rieši tak, že na "nečistú prácu" odkazuje použiť Javu, teda jej pole.
Žádná speciální syntax pro řetězení funkcí vracejících Option/Result v F# není. Lze použít Option.bind/Result.bind
w |> Option.bind f1 |> Option.bind f2
Alternativou jsou computational expressions Třeba z knihovny FsToolkit.ErrorHandling:
option {
let! x = w
let! y = f1 x
return! f2 y
}
aha, ja mel prave za to, ze tyto wrappery mi umozni napsat si rozumne pipeliny (ja vim, to slovo se zneuziva), proste "streaming" nejak bez mezikontrol. Ale kdyz o tom premyslim, tak je to asi trosku jedno, ty samotne funkce muzu napsat tak, ze berou option/result a vraci totez. jen to asi nebudou vsechny knihovni funkce.
bind zkusim najit, diky!