Forum:  Programmieren
Thema: \(\begingroup\) Haskell: Typ einer Funktion angeben\(\endgroup\)
Themen-Übersicht
MrPayDay
Junior
Dabei seit: 15.05.2018
Mitteilungen: 18
Aus:
Themenstart: 2018-05-15 18:20

ich verstehe diesen aufgaben teil leider nicht ich hoffe es kann mir jemand weiterhelfen:

Die Typen der Funktionen map, iterate, flip und const (mit jeweils frischen Typvariablen) sind:
map :: (a -> b) -> [a] -> [b]
iterate :: (c -> c) -> c -> [c]
flip :: (d -> e -> f) -> (e -> d -> f)
const :: g -> h -> g
F¨ur alle Teilaufgaben ist der Rechenweg erforderlich.
a) Berechnen Sie den Typ von (map iterate) mit der in der Vorlesung vorgestellten Typregel f¨ur
die Anwendung, sowie dem Verfahren zur Unifikation von Typen.

b) Zeigen Sie, dass die Anwendung (iterate map) nicht typisierbar ist, indem Sie versuchen den
Ausdruck mit der in der Vorlesung vorgestellten Typregel f¨ur Anwendungen zu typisieren. Rechnen
Sie solange, bis ein Fehler auftritt.

c) Verwenden Sie die Anwendungsregel f¨ur mehrere Argumente und die Unifikation von Typen, um
den Typ von (iterate flip const) zu berechnen.


ligning
Senior
Dabei seit: 07.12.2014
Mitteilungen: 2149
Aus: Berlin
Beitrag No.1, eingetragen 2018-05-15 18:25

Hallo,

kannst du genauer sagen, was du nicht verstehst?

Außerdem braucht man zur Lösung der Aufgabe das "in der Vorlesung vorgestellte" Verfahren, das müsstest du noch angeben. (Nicht dass man das brauchen würde, aber da der "Rechenweg" mit angegeben werden muss, ist es wohl essentiell ...)


MrPayDay
Junior
Dabei seit: 15.05.2018
Mitteilungen: 18
Aus:
Beitrag No.2, vom Themenstarter, eingetragen 2018-05-15 19:07

ich poste mal den link zum skript: www-stud.rbi.informatik.uni-frankfurt.de/~prg2/SS2018/skript/teil1/Kap-3-typen-kurz.pdf

ich war leider an dem tag nicht in der vorlesung, ich habe gedacht ich würde es auch mit dem skript schaffen. Leider schaffe ich es nicht.
Deswegen bin ich leider auf hilfe angewiesen.


ligning
Senior
Dabei seit: 07.12.2014
Mitteilungen: 2149
Aus: Berlin
Beitrag No.3, eingetragen 2018-05-16 01:16

OK, und wo genau kommst du nicht weiter?


tactac
Senior
Dabei seit: 15.10.2014
Mitteilungen: 1240
Aus:
Beitrag No.4, eingetragen 2018-05-17 21:09
\(\begingroup\)\(\newcommand{\sem}[1]{[\![#1]\!]}\)
Beispiel: wir wollen den Typ von map map herausfinden.

Wir verteilen erstmal unterschiedliche Typvariablen, damit's weniger verwirrt: das erste map habe den Typ (a -> b) -> [a] -> [b] das zweite den Typ (c -> d) -> [c] -> [d]

Die Anwendungsregel für den Fall sagt:
<math>\begin{array}{c}
\mathsf{map}\colon (a\to b) \to [a]\to [b]\qquad \mathsf{map}\colon (c\to d) \to [c]\to [d] \qquad \gamma(a \to b) = \gamma((c\to d) \to [c]\to [d]) \\\hline
\mathsf{map\ map}\colon \gamma([a]\to [b]).
\end{array}</math>
$\gamma$ soll dabei eigentlich ein allgemeinster Unifikator von $a \to b$ mit $(c\to d) \to [c]\to [d]$ sein.
Da der äußerste Typkonstruktor auf beiden Seiten derselbe ist, nämlich $\to$, steigen wir rekursiv ab und haben simultan $a$ mit $c\to d$ und $b$ mit $[c]\to[d]$ zu unifizieren. Mit der hierdurch aufgezwungenen Substitution $\{a \mapsto c\to d, b \mapsto [c]\to [d]\}$ kommt sich nichts in Gehege, und wir können sie nehmen. Man erhält:
$\mathsf{map\ map}\colon [c\to d] \to [[c]\to [d]]$.

Zur weiteren Übung empfiehlt es sich vielleicht, herauszufinden, warum $$\mathsf{fmap\ fmap\ fmap\ fmap\ fmap}\colon \mathsf{Functor\ }f \Rightarrow (y \to z) \to (x \to y) \to f\ x \to f\ z.$$ (Hierbei spielt eine Rolle, dass $(x \to)$ für alle $x$ vordefinierterweise eine $\mathsf{Functor}$-Instanz ist.)  biggrin\(\endgroup\)
\(\endgroup\)



Dieses Forumbeitrag kommt von Matroids Matheplanet
http://https://matheplanet.de

Die URL für dieses Forum-Thema ist:
http://https://matheplanet.de/default3.html?topic=235841=5101
Druckdatum: 2018-06-22 05:17