Zprávy mají s funkcemi společnou jedinou věc, a to, že synchronně vracejí odpověď. Tím jejich podobnost končí.
To je minimálně zavádějící tvrzení.
1. funkce jsou statické, zprávy jsou akce
...
Tady jsme si spíš nerozuměli, předpokládal jsem, že se porovnává funkce z imperativních jazyků (tj. v podstatě procedura) s objektovým posíláním. Funkcionální funkci (tj. v podstatě matematickou funkci) jsem na mysli neměl.
2. zprávy nemusí být synchronní
...a dokonce je lepší, když defaultně nejsou, protože sesynchronizovat asynchronní události je v dobře navrženém jazyce triviální (kód v jazyce Elixir):
...
To vypadá dobře. I když implementovat asynchronní v synchronním jde tady.
3. odeslání zprávy nemusí nic "vracet" nebo může "vracet" víc hodnot postupně
...
To už je věcí implementace na druhé straně, to bych tu nerozebíral. Ale vypadá to zajímavě.
Immutable je immutable, takže pokud si pod "změnou stavu" představuješ změnu in situ, tak nijak. Jinak to ale může vypadat třeba takhle (jeden příklad z jiného světa, když odpověď "monády" ti nestačila):
# zjednodušený ilustrační příklad, v reálu by to vypadalo trochu jinak
defmodule StateHolder do
# tahle funkce spustí agenta držícího stav
def start_link() do
# spustí funkci loop s parametry [0] v novém vlákně
spawn_link(fn -> loop(0) end)
end
def loop(state) do
receive do
{:add,k} ->
new_state = state + k
IO.puts "stav se meni z #{state} na #{new_state}"
loop(new_state)
{:get_state,pid} ->
send(pid,{:state_is,state})
loop(state)
end
end
end
Monády mi stačila, jen jsem je nestihl prostudovat.
Pěkně jste napsal ten příklad (včetně použití). Jestli to chápu správně, tak z něj jde znát, že stav je pochopitelně v modulu přítomen, ale ve formě hodnoty state vznikající v novém kontextu při volání funkce loop (new_state). Zde odhaduju, že volání loop není jako call (rekurzivní), ale spíše něco jako goto, any bylo možno zahazovat opuštěný kontext předchozího volání funkce (jinak by se zaplnila paměť). Každopádně důsledkem je, že vnitřně je modul sice immutable, ale navenek (a to mě v interakci s ostatními zajímá) pochopitelně mutable. Tzn. tvrzení, že v FP je vše immutable, asi nebude pravdivé. Dále předpokládám, že jsou hodnoty při volání funkce či posílání zprávy předávány odkazem, jinak by celé toto čarování nemělo smysl.