391
Vývoj / Re:Haskell, ExistentialQuantification, forall
« kdy: 06. 04. 2021, 17:08:53 »Ten pattern mi přijde povědomej:Jak by si ho upravil aby nepadal na dělení nulou?V principu nějak takto:Kód: [Vybrat]calculate : Nat -> Nat
calculate n = case isNonZero n of
Yes prf => div 42 n prf
No contra => ...
Kód: [Vybrat]
calculate : Nat -> Maybe Nat
calculate n = case isNonZero n of
Yes prf => Just $ div 42 n prf
No contra => Nothing
versusKód: [Vybrat]
calculate : Nat -> Maybe Nat
calculate n = case isNonZero n of
Just x => Just $ div 42 x
Nothing => Nothing
Čímž v žádném případě neútočím proti ZT. Jen chci najít tu pointu.
Tahle funkce je už trochu pozdě na ten test na nenulovost, ale podstatné je, že isNonZero ti dá na zlatém podnosu důkaz nenulovosti, jejž chce div. A na rozdíl od testování obsahu Maybe se tady (u Dec) nic nezbaluje, ten důkaz (prf) existuje jen v době překladu, takže za běhu má div pouze dva argumenty, jak by běžný matematik čekal.
Tady si možná trochu ujasněme výraziva (a následně prosím vypíchni znova tu pointu):
- Za běhu funkce div nikoho nezajímá, nemá dva argumenty, není vůbec... Za běhu je na všechno pozdě a prostě děj se vůle boží.
- Cílem typů (Maybe nebo závislostních), nebo čehokoliv jiného, je přinutit mě, abych ošetřil všechny vstupy. To jsem demonstroval na tom ukázkovém kódu. Přijde string, ten může, ale také nemusí být číslo. A já se musím poprat s oběma variantama. Díky tomu, že funkce div přijímá číslo, a neexistuje funkce pro převod stringu na číslo (ale pouze převod stringu na Maybe číslo), jsem přinucen zohlednit, když se parsování nepovede. To je cíl - nedovolit překlad.
A cílem je něco takového i pro další nevalidní stavy, abych neumožnil nevalidní stav, a pokud to jinak nejde tak byl přinucen zohlednit výjimky.
(A tím nemám na mysli konsekvent a antecedent.)