<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Betelgeuse</title>
    <description>The latest articles on DEV Community by Betelgeuse (@betelgeuse).</description>
    <link>https://dev.to/betelgeuse</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F345316%2Fc3e830a4-8860-4d62-8984-97fa5e1c68d2.png</url>
      <title>DEV Community: Betelgeuse</title>
      <link>https://dev.to/betelgeuse</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/betelgeuse"/>
    <language>en</language>
    <item>
      <title>Ty cloudy</title>
      <dc:creator>Betelgeuse</dc:creator>
      <pubDate>Sun, 19 Jun 2022 09:50:53 +0000</pubDate>
      <link>https://dev.to/betelgeuse/ty-cloudy-39lm</link>
      <guid>https://dev.to/betelgeuse/ty-cloudy-39lm</guid>
      <description>&lt;p&gt;&lt;strong&gt;Cloud computing&lt;/strong&gt;, jak jej známe dnes, je s námi již dvě dekády a dávno nejde o buzzword. Metaforu mraku vnesl do distribuovaných systémů Apple na počátku devadesátých let, ale teprve s rozvojem internetu tento přístup k tvorbě softwarových systémů zpopularizoval Amazon se svým AWS (a následně se přidali další, například Microsoft s Azure). Zde se zaměříme na současný stav, především tedy monolity vs. mikroslužby, moderní úložiště a dnes nejlepší programovací jazyky pro tuto oblast.&lt;/p&gt;

&lt;h2&gt;
  
  
  Co nás čeká
&lt;/h2&gt;

&lt;p&gt;Cloudová služba sestává z vlastní aplikace (napsané například v Javě nebo nyní populárním Go), ideálně bezstavové, která musí někde běžet, typicky v kontejneru (Docker apod.) v nějakém shluku serverů.&lt;/p&gt;

&lt;p&gt;Data žijí v úložišti, ke kterému aplikace přistupuje a data vhodným způsobem prezentuje (buď přímo na webové stránce nebo pomocí API například pro mobilní aplikace). Dříve byly značně populární specializované objektové databáze, ovšem dnešní relační databáze nabízejí různá rozšíření pro práci s objektovými daty (například JSONB v PostgreSQL), jejichž nasazení je téměř vždy výhodnější. Případně se může použít nějaká NoSQL databáze, protože ty jsou oproti relačním podstatně výkonnější v distribuovaném prostředí. Příkladem je například Datastore v Google App Engine, ke které se záhy dostaneme.&lt;/p&gt;

&lt;h2&gt;
  
  
  Monolity a mikroslužby
&lt;/h2&gt;

&lt;p&gt;Monolitická aplikace je jedna velká binárka, jejíž instance běží na několika serverech a zpracovávají požadavky klientů. Taková aplikace se snáze píše, překládá, nasazuje a, popravdě, pro většinu projektů je tato architektura plně postačující.&lt;/p&gt;

&lt;p&gt;U velkých projektů se vyplácí rozsekání aplikace do samostatných celků, které se implementují a nasazují zvlášť a komunikují mezi sebou po síti. Nejpopulárnější jsou v současnosti v tomto ohledu mikroslužby, což jsou malé, funkčně omezené aplikace, každá ve svém vlastním kontejneru, které dohromady tvoří vysoce škálovatelnou aplikaci.&lt;/p&gt;

&lt;p&gt;Mikroslužby mezi sebou potřebují komunikovat rychle, k čemuž slouží specializované protokoly a knihovny, například gRPC. Každá má také svou databázi, v dobrém návrhu se nepoužívá jedna sdílená. Jednou z výhod mikroslužeb je, že každá může být napsaná v jiném jazyku (Java, C++, Go, Rust apod.) a používat jinou databázi (relační, dokumentovou, grafovou atd.)&lt;/p&gt;

&lt;h2&gt;
  
  
  Google App Engine (GAE)
&lt;/h2&gt;

&lt;p&gt;GAE je prostředí a sada knihoven od Googlu pro tvorbu cloudových aplikací, které lze psát v několika jazycích, z nichž je nejefektivnější Go (při použití tzv. "custom runtimes" lze použít libovolný jazyk, za tu námahu to ale nestojí). Později se podíváme i na neméně efektivní Rust.&lt;/p&gt;

&lt;p&gt;V GAE se typicky nasazují monolity (je ale možné aplikaci rozdělit do samostatných služeb), které mají přístup k rychlému objektovému úložišti, memcache (pro zrychlení zpracování požadavků) nebo třeba frontám úloh. Nasazení a správa jsou plně automatické, Google aplikaci přeloží, zabalí do kontejneru a bezpečně spustí na svých serverech. Nové instance jsou spouštěny automaticky s rostoucí zátěží.&lt;/p&gt;

&lt;p&gt;Datastore v GAE nemá žádné datové schéma, jde o poměrně jednoduchou NoSQL databázi. V Go lze ukládat přímo objekty, například:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="n"&gt;User&lt;/span&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;ID&lt;/span&gt;       &lt;span class="n"&gt;uuid&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;UUID&lt;/span&gt;
  &lt;span class="n"&gt;UserName&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;
  &lt;span class="n"&gt;Email&lt;/span&gt;    &lt;span class="kt"&gt;string&lt;/span&gt;
  &lt;span class="n"&gt;FullName&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;         &lt;span class="s"&gt;`datastore:",noindex"`&lt;/span&gt;
  &lt;span class="n"&gt;Key&lt;/span&gt;      &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;datastore&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Key&lt;/span&gt; &lt;span class="s"&gt;`datastore:"-"`&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;InsertUser&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ctx&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Context&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;u&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;User&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="kt"&gt;error&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;key&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;datastore&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;NewIncompleteKey&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"User"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;datastore&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Put&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;u&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="n"&gt;u&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Key&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Jednotlivé položky odpovídají sloupcům v relační databázi a automaticky se indexují, pokud není přítomen tag &lt;code&gt;noindex&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Příště si ukážeme jednoduchou aplikaci pro GAE a práci s databází.&lt;/p&gt;

</description>
      <category>cloud</category>
      <category>go</category>
      <category>postgres</category>
      <category>docker</category>
    </item>
    <item>
      <title>Rovnostní typy a negace typů</title>
      <dc:creator>Betelgeuse</dc:creator>
      <pubDate>Wed, 23 Feb 2022 11:15:59 +0000</pubDate>
      <link>https://dev.to/betelgeuse/rovnostni-typy-a-negace-typu-18c2</link>
      <guid>https://dev.to/betelgeuse/rovnostni-typy-a-negace-typu-18c2</guid>
      <description>&lt;p&gt;&lt;a href="https://dev.to/betelgeuse/prolegomena-k-uvodu-do-zakladu-zavislostnich-typu-4380"&gt;Předchozí článek&lt;/a&gt; byl úvodem do závislostních typů a jejich použití v bezpečnostně kritických aplikacích. V tomto zavedeme rovnostní typy a vylepšíme původní kód.&lt;/p&gt;

&lt;p&gt;Nejprve definice typu pro ilustrační příklad:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;data DayOfWeek = Mon | Tue | Wed | Thu | Fri | Sat | Sun
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Jednoduchá funkce ověří, že zadaný den je pondělí:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;isMonday : DayOfWeek -&amp;gt; Bool
isMonday Mon = True
isMonday _ = False
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;V kontraktech se často používají porovnání hodnot. Každé porovnání &lt;code&gt;a = b&lt;/code&gt; hodnot stejného typu je možné považovat za typ. Pokud rovnost platí, tento typ má hodnotu &lt;code&gt;Refl&lt;/code&gt;, kterou je možné použít ve funkcích. Následující funkce je v podstatě náhradou příslušného jednotkového testu, korektnost se ale ověřuje již v době překladu v rámci typové kontroly, ne až za běhu.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;aProof : (d : DayOfWeek) -&amp;gt; d = Mon -&amp;gt; isMonday d = True
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Tato funkce dostane dva argumenty a ověří, že funkce &lt;code&gt;isMonday&lt;/code&gt; vrátí správnou hodnotu. Její definice je&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;aProof _ prf = rewrite prf in Refl
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Typ návratové hodnoty je rovnostní, proto se musí jednat o nějaké &lt;code&gt;Refl&lt;/code&gt;. Tuto hodnotu získáme tak, že pomocí &lt;code&gt;rewrite&lt;/code&gt; přepíšeme &lt;code&gt;d&lt;/code&gt; na &lt;code&gt;Mon&lt;/code&gt; v typu &lt;code&gt;isMonday d&lt;/code&gt;, což se vyhodnotí jako &lt;code&gt;True&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Podobně bychom mohli mít analogický test, ale nyní chceme dokázat, že něco neplatí. Zavedeme proto negaci typů, &lt;code&gt;Not T&lt;/code&gt;, což je v zásadě funkce typu &lt;code&gt;T -&amp;gt; Void&lt;/code&gt;, kde &lt;code&gt;Void&lt;/code&gt; je typ bez hodnot. Tuto funkci proto není možné zavolat, neboť není možné vrátit žádnou hodnotu. Příkladem budiž následující analogie jednotkového testu:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;anotherProof : (d : DayOfWeek) -&amp;gt; d = Tue -&amp;gt; Not (isMonday d = True)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Definice této funkce je&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;anotherProof _ prf = rewrite prf in falseNotTrue
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Zbývá definovat funkci &lt;code&gt;falseNotTrue&lt;/code&gt; typu &lt;code&gt;Not (False = True)&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;falseNotTrue : Not (False = True)
falseNotTrue _ impossible
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Obecně platí, že dvě hodnoty stejného typu můžou být shodné ve smyslu výrokové rovnosti, pokud výslovně neřekneme, že se rovnat nemůžou.&lt;/p&gt;

&lt;p&gt;Vraťme se nyní ke staré známé funkci &lt;code&gt;safeDiv&lt;/code&gt;. Změníme typ kontraktu, že nelze dělit nulou:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;safeDiv : Nat -&amp;gt; (n : Nat) -&amp;gt; {auto prf : Not (n = 0)} -&amp;gt; Nat
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Budeme potřebovat pomocnou funkci říkající, že nula není následníkem žádného přirozeného čísla:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sucNonZero : (n : Nat) -&amp;gt; Not ((S n) = 0)
sucNonZero _ _ impossible
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Původní funkce &lt;code&gt;isNonZero&lt;/code&gt; nyní vypadá takto:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;isNonZero : (n : Nat) -&amp;gt; Maybe (Not (n = 0))
isNonZero 0 = Nothing
isNonZero (S n) = Just (sucNonZero n)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Je potěšitelné, že na samotné funkci &lt;code&gt;safeDiv&lt;/code&gt; se nic nemění.&lt;/p&gt;

&lt;p&gt;Funkce &lt;code&gt;isNonZero&lt;/code&gt; je ale stále poněkud problematická, protože sice někdy vrací důkaz nenulovosti, ale pokud je výsledkem &lt;code&gt;Nothing&lt;/code&gt;, nevíme, jestli je argument funkce nulový nebo ne. Místo &lt;code&gt;Nothing&lt;/code&gt; bychom chtěli důkaz &lt;code&gt;n = 0&lt;/code&gt;. K tomu slouží typový operátor &lt;code&gt;Dec&lt;/code&gt;, kterému se budeme věnovat příště.&lt;/p&gt;

</description>
      <category>agda</category>
      <category>coq</category>
      <category>idris</category>
    </item>
    <item>
      <title>Prolegomena k úvodu do základů závislostních typů</title>
      <dc:creator>Betelgeuse</dc:creator>
      <pubDate>Mon, 21 Feb 2022 22:29:08 +0000</pubDate>
      <link>https://dev.to/betelgeuse/prolegomena-k-uvodu-do-zakladu-zavislostnich-typu-4380</link>
      <guid>https://dev.to/betelgeuse/prolegomena-k-uvodu-do-zakladu-zavislostnich-typu-4380</guid>
      <description>&lt;p&gt;Funkce většinou pracují s hodnotami jako čísla, řetězce nebo záznamy, například &lt;code&gt;12&lt;/code&gt; nebo &lt;code&gt;Praha&lt;/code&gt;, jejichž typy jsou &lt;code&gt;Nat&lt;/code&gt; a &lt;code&gt;String&lt;/code&gt;. Matematické funkce mohou ale pracovat s libovolnými objekty, je proto smysluplné ptát se, jakého typu je ono &lt;code&gt;Nat&lt;/code&gt; nebo &lt;code&gt;String&lt;/code&gt;. Zadefinujme si jejich typ jako &lt;code&gt;Type&lt;/code&gt;. To nám umožní definovat takovouto funkci:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;getType : Bool -&amp;gt; Type
getType True = String
getType False = Nat
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Funkce &lt;code&gt;getType&lt;/code&gt; je sama o sobě k ničemu, ale co kdybychom ji použili v definici jiné funkce? Zkusme například&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;getValue : (b : Bool) -&amp;gt; getType b
getValue True = "abcd"
getValue False = 1234
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Protože funkce &lt;code&gt;getType&lt;/code&gt; vrací typ (hodnotu typu &lt;code&gt;Type&lt;/code&gt;), můžeme ji použít pro výpočet typu návratové hodnoty funkce &lt;code&gt;getValue&lt;/code&gt;, kterou můžeme použít takto:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;putStrLn $ show $ getValue True
putStrLn $ show $ getValue False
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pokud vám tato funkce připadá divná, máte pravdu, ve většině jazyků by zapsat nešla, ale v jazycích s takzvanými závislostními typy jsou takovéto funkce běžné.&lt;/p&gt;

&lt;p&gt;Představme si, že chceme napsat funkci pro dělení přirozených čísel, která funguje korektně (bez pádů nebo výjimek) na všech vstupech. Předpokládáme, že máme funkci typu&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;divNat : Nat -&amp;gt; Nat -&amp;gt; Nat
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;která ale při dělení nulou zkolabuje. Máme dvě možnosti: buď rozšíříme typ návratové hodnoty, abychom mohli při pokusu o dělení nulou sdělit, že výpočet nelze provést, nebo zúžíme definiční obor funkce pro dělení. V prvním případě dostaneme například:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;safeDiv : Nat -&amp;gt; Nat -&amp;gt; Maybe Nat
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;a pří dělení nulou vrátíme místo číselného výsledku &lt;code&gt;Nothing&lt;/code&gt;. Ve druhém případě musíme přidat k funkci argument, který zaručí, že dělitel je nenulový:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;safeDiv : Nat -&amp;gt; (n : Nat) -&amp;gt; {auto prf : IsNonZero n} -&amp;gt; Nat
safeDiv m n {prf} = divNat m n
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Všimněte si, že &lt;code&gt;IsNonZero&lt;/code&gt; je generický typ, jehož parametrem je přirozené číslo. K definici tohoto typu využijeme úvahu, že přirozené číslo je nenulové, pokud má předchůdce (který je taktéž přirozeným číslem):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;data IsNonZero : Nat -&amp;gt; Type where
    SucNonZero : (n : Nat) -&amp;gt; IsNonZero (S n)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Důkaz nenulovosti druhého argumentu není vždy možné automaticky odvodit, pokud jej například čteme na vstupu, uživateli nic nebrání zadat nulu. Potřebujeme proto funkci, která nám příslušný důkaz dodá, pokud existuje:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;isNonZero : (n : Nat) -&amp;gt; Maybe (IsNonZero n)
isNonZero 0 = Nothing
isNonZero (S n) = Just (SucNonZero n)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Funkce &lt;code&gt;isNonZero&lt;/code&gt; vrátí &lt;code&gt;Nothing&lt;/code&gt; pro nulu a důkaz nenulovosti (dodá předchůdce čísla na vstupu) v ostatních případech. Pokud tedy v kódu není možné nenulovost dělitele odvodit automaticky (viz deklarace &lt;code&gt;auto prf&lt;/code&gt;), použijeme funkci &lt;code&gt;isNonZero&lt;/code&gt;, která příslušný důkaz umí dodat (jinak vrátí &lt;code&gt;Nothing&lt;/code&gt;):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Just m &amp;lt;- readNat | Nothing =&amp;gt; putStrLn "not a number"
Just n &amp;lt;- readNat | Nothing =&amp;gt; putStrLn "not a number"
case isNonZero n of
    Just prf =&amp;gt; putStrLn $ show $ safeDiv m n {prf=prf}
    _ =&amp;gt; putStrLn "division by zero"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Přidaný třetí argument se tak dá považovat za kontrakt. Podobný přístup se používá i v jiných jazycích navržených pro bezpečnostně kritické aplikace, například v jazyce SPARK.&lt;/p&gt;

&lt;p&gt;V &lt;a href="https://dev.to/betelgeuse/rovnostni-typy-a-negace-typu-18c2"&gt;pokračování&lt;/a&gt; dojde na typy, které vyjadřují rovnost a negaci.&lt;/p&gt;

</description>
      <category>agda</category>
      <category>coq</category>
      <category>idris</category>
    </item>
  </channel>
</rss>
