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!