mirror of
https://github.com/ikoHSE/sc-lectures.git
synced 2024-10-26 07:07:11 +03:00
Added parametric polymorphism to l1
This commit is contained in:
parent
6bdc0f59b2
commit
de99d7e2f3
46
1.html
46
1.html
@ -666,6 +666,52 @@
|
||||
|
||||
<p><code>filter</code> тоже есть в стандартной библиотеке.</p>
|
||||
</section>
|
||||
<section id="еще-немного-структур" class="slide level1">
|
||||
<h1>Еще немного структур</h1>
|
||||
</section>
|
||||
<section class="slide level1">
|
||||
|
||||
<h2 id="параметрмческий-полиморфизм">Параметрмческий полиморфизм</h2>
|
||||
<h3 id="дженерики">(Дженерики)</h3>
|
||||
<div class="sourceCode" id="cb123"><pre class="sourceCode haskell fragment"><code class="sourceCode haskell"><span id="cb123-1"><a href="#cb123-1"></a><span class="kw">data</span> <span class="dt">IntList</span> <span class="ot">=</span> <span class="dt">Cons</span> <span class="dt">Int</span> <span class="dt">IntList</span> <span class="op">|</span> <span class="dt">Nil</span></span></code></pre></div>
|
||||
<aside class="notes">
|
||||
<p>Мы научиоись делать список интов. А что если мы хотим сделать просто список. Чего-нибудь.</p>
|
||||
</aside>
|
||||
<div class="sourceCode" id="cb124"><pre class="sourceCode haskell fragment"><code class="sourceCode haskell"><span id="cb124-1"><a href="#cb124-1"></a><span class="kw">data</span> <span class="dt">List</span> a <span class="ot">=</span> <span class="dt">Cons</span> a (<span class="dt">List</span> a) <span class="op">|</span> <span class="dt">Nil</span></span></code></pre></div>
|
||||
<div class="sourceCode" id="cb125"><pre class="sourceCode haskell fragment"><code class="sourceCode haskell"><span id="cb125-1"><a href="#cb125-1"></a><span class="ot">ints ::</span> <span class="dt">List</span> <span class="dt">Int</span></span>
|
||||
<span id="cb125-2"><a href="#cb125-2"></a>ints <span class="ot">=</span> <span class="dt">Cons</span> <span class="dv">1</span> (<span class="dt">Cons</span> <span class="dv">2</span> (<span class="dt">Cons</span> <span class="dv">3</span> <span class="dt">Nil</span>))</span></code></pre></div>
|
||||
<div class="sourceCode" id="cb126"><pre class="sourceCode haskell fragment"><code class="sourceCode haskell"><span id="cb126-1"><a href="#cb126-1"></a><span class="co">-- Типы как всегда можно не писать</span></span>
|
||||
<span id="cb126-2"><a href="#cb126-2"></a><span class="ot">strings ::</span> <span class="dt">List</span> <span class="dt">String</span></span>
|
||||
<span id="cb126-3"><a href="#cb126-3"></a>strings <span class="ot">=</span> <span class="dt">Cons</span> <span class="st">"one"</span> (<span class="dt">Cons</span> <span class="st">"two"</span> (<span class="dt">Cons</span> <span class="st">"three"</span> <span class="dt">Nil</span>))</span></code></pre></div>
|
||||
<div class="sourceCode" id="cb127"><pre class="sourceCode haskell fragment"><code class="sourceCode haskell"><span id="cb127-1"><a href="#cb127-1"></a><span class="ot">strings ::</span> <span class="dt">List</span> <span class="dt">String</span></span>
|
||||
<span id="cb127-2"><a href="#cb127-2"></a>strings <span class="ot">=</span> <span class="dt">Cons</span> <span class="st">"one"</span> (<span class="dt">Cons</span> <span class="st">"two"</span> (<span class="dt">Cons</span> <span class="st">"three"</span> <span class="dt">Nil</span>))</span></code></pre></div>
|
||||
</section>
|
||||
<section class="slide level1">
|
||||
|
||||
<div class="sourceCode" id="cb128"><pre class="sourceCode haskell"><code class="sourceCode haskell"><span id="cb128-1"><a href="#cb128-1"></a>things <span class="ot">=</span> <span class="dt">Cons</span> (<span class="st">"one"</span><span class="ot"> ::</span> <span class="dt">String</span>) (<span class="dt">Cons</span> (<span class="dv">2</span><span class="ot"> ::</span> <span class="dt">Int</span>) <span class="dt">Nil</span>)</span></code></pre></div>
|
||||
<pre class="fragment"><code> • Couldn't match type ‘Int’ with ‘String’
|
||||
Expected type: List String
|
||||
Actual type: List Int
|
||||
|
|
||||
10 | things = Cons ("one" :: String) (Cons (2 :: Int) Nil)
|
||||
| ^^^^^^^^^^^^^^^^^^^</code></pre>
|
||||
<div class="sourceCode" id="cb130"><pre class="sourceCode haskell fragment"><code class="sourceCode haskell"><span id="cb130-1"><a href="#cb130-1"></a><span class="kw">data</span> <span class="dt">List</span> a <span class="ot">=</span> <span class="dt">Cons</span> a (<span class="dt">List</span> a) <span class="op">|</span> <span class="dt">Nil</span></span></code></pre></div>
|
||||
<p><span class="fragment"><code>a</code> должен всегда быть <code>a</code>.</span></p>
|
||||
</section>
|
||||
<section class="slide level1">
|
||||
|
||||
<div class="sourceCode" id="cb131"><pre class="sourceCode haskell"><code class="sourceCode haskell"><span id="cb131-1"><a href="#cb131-1"></a><span class="fu">take</span><span class="ot"> ::</span> <span class="dt">Int</span> <span class="ot">-></span> <span class="dt">IntList</span> <span class="ot">-></span> <span class="dt">IntList</span></span>
|
||||
<span id="cb131-2"><a href="#cb131-2"></a><span class="fu">take</span> _ <span class="dt">Nil</span> <span class="ot">=</span> <span class="dt">Nil</span></span>
|
||||
<span id="cb131-3"><a href="#cb131-3"></a><span class="fu">take</span> <span class="dv">0</span> _ <span class="ot">=</span> <span class="dt">Nil</span></span>
|
||||
<span id="cb131-4"><a href="#cb131-4"></a><span class="fu">take</span> n (<span class="dt">Cons</span> x xs) <span class="ot">=</span> <span class="dt">Cons</span> x (<span class="fu">take</span> (n <span class="op">-</span> <span class="dv">1</span>) xs)</span></code></pre></div>
|
||||
<div class="sourceCode" id="cb132"><pre class="sourceCode haskell fragment"><code class="sourceCode haskell"><span id="cb132-1"><a href="#cb132-1"></a><span class="fu">take</span><span class="ot"> ::</span> <span class="dt">Int</span> <span class="ot">-></span> <span class="dt">List</span> a <span class="ot">-></span> <span class="dt">List</span> a</span>
|
||||
<span id="cb132-2"><a href="#cb132-2"></a><span class="fu">take</span> _ <span class="dt">Nil</span> <span class="ot">=</span> <span class="dt">Nil</span></span>
|
||||
<span id="cb132-3"><a href="#cb132-3"></a><span class="fu">take</span> <span class="dv">0</span> _ <span class="ot">=</span> <span class="dt">Nil</span></span>
|
||||
<span id="cb132-4"><a href="#cb132-4"></a><span class="fu">take</span> n (<span class="dt">Cons</span> x xs) <span class="ot">=</span> <span class="dt">Cons</span> x (<span class="fu">take</span> (n <span class="op">-</span> <span class="dv">1</span>) xs)</span></code></pre></div>
|
||||
<aside class="notes">
|
||||
<p>Поменялся только тип!</p>
|
||||
</aside>
|
||||
</section>
|
||||
<section id="где-и-как-смотреть-стандартную-библиотеку" class="slide level1">
|
||||
<h1>Где и как смотреть “стандартную библиотеку”</h1>
|
||||
</section>
|
||||
|
79
1.md
79
1.md
@ -958,6 +958,85 @@ quicksort [2, 1, 3, 4]
|
||||
|
||||
---
|
||||
|
||||
# Еще немного структур
|
||||
|
||||
---
|
||||
|
||||
## Параметрмческий полиморфизм
|
||||
|
||||
### (Дженерики)
|
||||
|
||||
```{ .haskell .fragment }
|
||||
data IntList = Cons Int IntList | Nil
|
||||
```
|
||||
|
||||
:::notes
|
||||
Мы научиоись делать список интов. А что если мы хотим сделать просто список. Чего-нибудь.
|
||||
:::
|
||||
|
||||
```{ .haskell .fragment }
|
||||
data List a = Cons a (List a) | Nil
|
||||
```
|
||||
|
||||
```{ .haskell .fragment }
|
||||
ints :: List Int
|
||||
ints = Cons 1 (Cons 2 (Cons 3 Nil))
|
||||
```
|
||||
|
||||
```{ .haskell .fragment }
|
||||
-- Типы как всегда можно не писать
|
||||
strings :: List String
|
||||
strings = Cons "one" (Cons "two" (Cons "three" Nil))
|
||||
```
|
||||
|
||||
```{ .haskell .fragment }
|
||||
strings :: List String
|
||||
strings = Cons "one" (Cons "two" (Cons "three" Nil))
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
```{ .haskell }
|
||||
things = Cons ("one" :: String) (Cons (2 :: Int) Nil)
|
||||
```
|
||||
|
||||
```fragment
|
||||
• Couldn't match type ‘Int’ with ‘String’
|
||||
Expected type: List String
|
||||
Actual type: List Int
|
||||
|
|
||||
10 | things = Cons ("one" :: String) (Cons (2 :: Int) Nil)
|
||||
| ^^^^^^^^^^^^^^^^^^^
|
||||
```
|
||||
|
||||
```{ .haskell .fragment }
|
||||
data List a = Cons a (List a) | Nil
|
||||
```
|
||||
|
||||
[`a` должен всегда быть `a`.]{.fragment}
|
||||
|
||||
---
|
||||
|
||||
```{ .haskell }
|
||||
take :: Int -> IntList -> IntList
|
||||
take _ Nil = Nil
|
||||
take 0 _ = Nil
|
||||
take n (Cons x xs) = Cons x (take (n - 1) xs)
|
||||
```
|
||||
|
||||
```{ .haskell .fragment }
|
||||
take :: Int -> List a -> List a
|
||||
take _ Nil = Nil
|
||||
take 0 _ = Nil
|
||||
take n (Cons x xs) = Cons x (take (n - 1) xs)
|
||||
```
|
||||
|
||||
:::notes
|
||||
Поменялся только тип!
|
||||
:::
|
||||
|
||||
---
|
||||
|
||||
# Где и как смотреть "стандартную библиотеку"
|
||||
|
||||
---
|
||||
|
@ -11,3 +11,4 @@
|
||||
- Currying
|
||||
- Lists
|
||||
- Quicksort
|
||||
- Parametric polymorphism in structures
|
||||
|
Loading…
Reference in New Issue
Block a user