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.
Je to trochu jinak (na SO to je vysvětlené správně). Nic se nezahodí, to pole tam prostě zůstane a změní se in situ.
Na SO je ale špatně popis "do", to funguje v Leanu s každou monádou, nejen IO, takže se výsledky funkcí zabalovat nijak nemusí.
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.
Ten postup v oddíle 13 (zahodit popis erroru a vypsat vlastní odhad toho co se stalo) je idiomatický? By mi přišlo "správnější" a i ilustrativnější vypsat získaný error.
ne, máte pravdu, idiomatické to není. Lepší by byl ten postup, který zmiňujete
10. 10. 2023, 17:40 editováno autorem komentáře
Takze predpokladam, ze je asi mozne zretezit vypocty do "pipeline"?
Neco na zpusob:
hodnota -> f1().f2().f3().f4() -> Option
nebo
hodnota -> f5().f6().f7().f8() -> Result
aniz bych musel u mezivysledku kontrolovat "nully"?
Tedy ze ten unwrapping s wrappingem si ty funkce udelaji samy?
Žá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!
Je to prostě haskellovské >>= (BTW žádná funkce by neměla brát Option/Result). Série volání pomocí bind je přímo definice pipeline :)
>>= ale to si můžeme nadefinovat jako symbol (jo, blbě se to pamatuje, prostě člověk ví, že je tam šipka a něco :-)
Ukážu to v článku o OCamlu.
jak píšou předřečníci, lepší je použít Option.bind a Result.bind. Sem do článku se to už nevlezlo, ale ukážu to pozítří na OCamlu, kde je to +- stejné.