Matroids Matheplanet Forum Index
Moderiert von matph
Informatik » Programmieren » Einige Fragen zu Übungen mit Haskell
Seite 1   [1 2]   2 Seiten
Autor
Universität/Hochschule Einige Fragen zu Übungen mit Haskell
carlox
Aktiv Letzter Besuch: in der letzten Woche
Dabei seit: 22.02.2007
Mitteilungen: 1407
  Themenstart: 2021-11-02

Hallo allerseits, Um etwas zu üben, habe ich ein paar kleine Programme in Haskell geschrieben. Siehe unten. 1) jetzt will ich eine (beliebeige) Liste auf dem Bildschirm ausgeben. Gibt es da eine vorgefertigte Funktion (so ähnlich wie print)? Wie muß ich diese anwenden ? 2) Was bedeutet die Syntax unten: (Num a) => [a] -> [a] \sourceon {- ACHTUNG: Importiertes Modul am Anfang mit Grossbuchstabe -} import Myfunc_10 main = do print(fib 10) print (laenge [1,2,3,4,5]) print (laengensumme [10,20,30,40]) print (laenge ['a','b','x','c','d']) print (laenge "abcde") print (listemalzwei [10,20,30,40]) \sourceoff \sourceon {- ACHTUNG: Importiertes Modul am Anfang mit Grossbuchstabe -} module Myfunc_10 ( fib, laenge, laengensumme, listemalzwei, printlist ) where fib :: Int -> Int fib n | (n==0) = 1 | (n==1) = 2 | otherwise = fib (n-1) + fib(n-2) -- Berechnet die Länge einer Liste -- Beispiel: [10,20,30,40] --> 4 laenge :: [a] -> Int laenge [] = 0 laenge (x:xs) = 1 + laenge xs -- Berechnet die Summe der Zahlenwerte einer Liste aus Zahlen -- Beispiel: [10,20,30,40] --> 10+20+30+40 = 100 laengensumme :: [Int] -> Int laengensumme [] = 0 laengensumme (x:xs) = x + laengensumme xs -- Wert einer Liste verdoppeln listemalzwei :: (Num a) => [a] -> [a] listemalzwei [] = [] listemalzwei (x:xs) = 2*x : listemalzwei xs \sourceoff mfg cx


   Profil
tactac
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 15.10.2014
Mitteilungen: 2552
  Beitrag No.1, eingetragen 2021-11-02

1) Man kann auf der Konsole nur Zeichenketten ausgeben. Ein Typ, der Instanz der Typklasse Show ist, stellt eine Funktion zur Darstellung seiner Werte als Zeichenkette zur Verfügung (nämlich: show). [a] ist automatisch Instanz von Show, wenn a es ist. print x ist definiert als putStrLn (show x); print hat den Typ Show a => a -> IO (). 2) f :: Num a => [a] -> [a] bedeutet: f ist 'ne Funktion, die, für alle Typen a, die Instanz von Num sind, a-Listen auf a-Listen abbildet. Dass ein Typ a Instanz von Num ist, bedeutet dabei u.a., dass auf a eine Ringstruktur definiert ist, auf die man mit Integer-Literalen und +,-,* zugreifen kann.


   Profil
carlox
Aktiv Letzter Besuch: in der letzten Woche
Dabei seit: 22.02.2007
Mitteilungen: 1407
  Beitrag No.2, vom Themenstarter, eingetragen 2021-11-03

\quoteon(2021-11-02 22:02 - tactac in Beitrag No. 1) 1) Man kann auf der Konsole nur Zeichenketten ausgeben. \quoteoff Habe es gerade nochmals nachgeprüft und jetzt erst entdeckt: Die Anweisung (in meinem Ursprungsposting): print (listemalzwei [10,20,30,40]) gibt die Zahlenfolge auf dem Bildschirm aus. mfg cx


   Profil
tactac
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 15.10.2014
Mitteilungen: 2552
  Beitrag No.3, eingetragen 2021-11-03

\quoteon(2021-11-03 09:11 - carlox in Beitrag No. 2) \quoteon(2021-11-02 22:02 - tactac in Beitrag No. 1) 1) Man kann auf der Konsole nur Zeichenketten ausgeben. \quoteoff Habe es gerade nochmals nachgeprüft und jetzt erst entdeckt: Die Anweisung (in meinem Ursprungsposting): print (listemalzwei [10,20,30,40]) gibt die Zahlenfolge auf dem Bildschirm aus. \quoteoff print überreicht auch nur eine Zeichenkette an die eigentliche Ausgabefunktionalität. Die Zeichenfolge wird wie beschrieben mithilfe der show-Methode ermittelt.


   Profil
carlox
Aktiv Letzter Besuch: in der letzten Woche
Dabei seit: 22.02.2007
Mitteilungen: 1407
  Beitrag No.4, vom Themenstarter, eingetragen 2021-11-03

Hallo allerseits, beim Experimentiere mit rekursiven Datentypen gab es folgende Fehlermeldung. Was muss ich in meinem Programm verändern ? \sourceon ghci> :load main_10.hs [1 of 2] Compiling Myfunc_10 ( Myfunc_10.hs, interpreted ) [2 of 2] Compiling Main ( main_10.hs, interpreted ) main_10.hs:24:22: error: Data constructor not in scope: Blatt :: t0 -> Myfunc_10.Baum | 24 | print (baumliste (Blatt 5)) | ^^^^^ Failed, one module loaded. \sourceoff \sourceon {- ACHTUNG: Importiertes Modul am Anfang mit Grossbuchstabe -} import Myfunc_10 main = do print(fib 10) print (laenge [1,2,3,4,5]) print (laengensumme [10,20,30,40]) -- Eine Menge wird wie in der Mathematik angegeben print (laengensumme [x | x <- [1..10], mod(x*x) 2 == 0]) -- Anfügen einer Lsite an die andere mit ++ aus der Haskell-Library print ([1,2,3,4,5]++[11,13,17,19,23,27]) print (laenge ['a','b','x','c','d']) print (laenge "abcde") print (listemalzwei [10,20,30,40]) print (rechteckberechnung (10,20)) print (addliste [5,4] [13,17]) print (baumliste (Blatt 5)) -- print (baumliste (Knoten (Knoten (Blatt 2) (Blatt 1)) (Blatt 3) ) ) \sourceoff \sourceon {- ACHTUNG: Importiertes Modul am Anfang mit Grossbuchstabe -} module Myfunc_10 ( fib, laenge, laengensumme, listemalzwei, rechteckberechnung, addliste, baumliste, ) where fib :: Int -> Int fib n | (n==0) = 1 | (n==1) = 2 | otherwise = fib (n-1) + fib(n-2) -- Berechnet die Länge einer Liste -- Beispiel: [10,20,30,40] --> 4 laenge :: [a] -> Int laenge [] = 0 laenge (x:xs) = 1 + laenge xs -- Berechnet die Summe der Zahlenwerte einer Liste aus Zahlen -- Beispiel: [10,20,30,40] --> 10+20+30+40 = 100 laengensumme :: [Int] -> Int laengensumme [] = 0 laengensumme (x:xs) = x + laengensumme xs -- Wert einer Liste verdoppeln listemalzwei :: (Num a) => [a] -> [a] listemalzwei [] = [] listemalzwei (x:xs) = 2*x : listemalzwei xs -- 2 Listen gleichen Typs aneinanderfügen addliste :: [a] -> [a] -> [a] addliste [] liste = liste addliste (x:xs) liste = x : addliste xs liste -- Fläche und Umfang eines Rechtecks berechnen -- Dabei werden Tupel verwendet, um 2 Rückgabewerte zu erzeugen rechteckberechnung :: (Int, Int) -> (Int, Int) rechteckberechnung (a,b) = (a*b, 2*a+2*b) {- rekursiver Datentyp Design des Baums: Jedes Blatt hat einen Integer-Wert und der Baum besteht aus einem linken und rechten Unterbaum. -} data Baum = Blatt Int | Knoten Baum Baum baumliste :: Baum -> [Int] baumliste (Blatt a) = [a] baumliste (Knoten a b) = (baumliste a) ++ (baumliste b) \sourceoff mfg cx


   Profil
ligning
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 07.12.2014
Mitteilungen: 3472
Wohnort: Berlin
  Beitrag No.5, eingetragen 2021-11-03

Immer wieder das gleiche. Wenn ein Bezeichner nicht gefunden wird, dann hast du ihn entweder nicht deklariert oder nicht aus dem Modul exportiert. Wenn du Baum(..) in die Exportliste schreibst werden auch gleich die Konstruktoren Blatt und Knote mit exportiert. Ich schlage (mal wieder) vor, du lässt das mit den separaten Modulen erstmal bleiben und machst alles in einer Datei.


   Profil
carlox
Aktiv Letzter Besuch: in der letzten Woche
Dabei seit: 22.02.2007
Mitteilungen: 1407
  Beitrag No.6, vom Themenstarter, eingetragen 2021-11-03

\quoteon(2021-11-03 14:54 - ligning in Beitrag No. 5) Ich schlage (mal wieder) vor, du lässt das mit den separaten Modulen erstmal bleiben und machst alles in einer Datei. \quoteoff Ok, ... ich würde es aber trotzdem mal probieren. Ich habe einfach mal etwas probiert. Funktioniert aber nicht. Wie muss es richtig geschrieben werden? (Habe das Programm abgespeckt, d.h. andere Funktionen gelöscht). Hier die Fehlermeldung: \sourceon :load main_11.hs Myfunc_11.hs:8:3: error: parse error on input `data' | 8 | data Baum, | ^^^^ Failed, no modules loaded.\sourceoff \sourceoff \sourceon {- ACHTUNG: Importiertes Modul am Anfang mit Grossbuchstabe -} import Myfunc_11 main = do print (baumliste (Blatt 5)) print (baumliste (Knoten (Knoten (Blatt 2) (Blatt 1)) (Blatt 3) ) ) -- eine Liste von aufeinanderfolgenden Zeicnen print ['a','b'..'m'] \sourceoff \sourceon {- ACHTUNG: Importiertes Modul am Anfang mit Grossbuchstabe -} module Myfunc_11 ( data Baum, baumliste, ) where {- rekursiver Datentyp Design des Baums: Jedes Blatt hat einen Integer-Wert und der Baum besteht aus einem linken und rechten Unterbaum. -} data Baum = Blatt Int | Knoten Baum Baum baumliste :: Baum -> [Int] baumliste (Blatt a) = [a] baumliste (Knoten a b) = (baumliste a) ++ (baumliste b) \sourceoff mfg cx


   Profil
carlox
Aktiv Letzter Besuch: in der letzten Woche
Dabei seit: 22.02.2007
Mitteilungen: 1407
  Beitrag No.7, vom Themenstarter, eingetragen 2021-11-03

Hallo allerseits, habe 2 Versionen von splitten geschrieben. Einmal mit let und das andere Mal mit where. Bei where gibt es Problem: "Non-exhaustive patterns in (x : listeLinks, listeRechts)" Warum ? Was mache ich falsch? Hier die Fehlermeldung: \sourceon :load main_12.hs [1 of 2] Compiling Myfunc_12 ( Myfunc_12.hs, interpreted ) [2 of 2] Compiling Main ( main_12.hs, interpreted ) Ok, two modules loaded. ghci> main ("abc","defghijklm") ("a","bc") ("*** Exception: Myfunc_12.hs:26:27-74: Non-exhaustive patterns in (x : listeLinks, listeRechts) \sourceoff // main_12.hs \sourceon {- ACHTUNG: Importiertes Modul am Anfang mit Grossbuchstabe -} import Myfunc_12 main = do print (splitten 3 ['a','b'..'m']) print (splitten 1 ['a','b','c']) print (splittenV1 1 ['a','b','c']) \sourceoff myfunc_12.hs \sourceon {- ACHTUNG: Importiertes Modul am Anfang mit Grossbuchstabe -} module Myfunc_12 ( splitten, splittenV1, ) where -- eine Liste an der Stelle n splitten splitten :: Int -> [a] -> ([a] , [a]) splitten 0 liste = ([] , liste) splitten n [] = ([] , []) splitten n (x:xs) = let (listeLinks,listeRechts) = splitten (n-1) xs in (x:listeLinks,listeRechts) -- alternative Version : eine Liste an der Stelle n splitten splittenV1 :: Int -> [a] -> ([a] , [a]) splittenV1 0 liste = ([] , liste) splittenV1 n [] = ([] , []) splittenV1 n (x:xs) = (x:listeLinks,listeRechts) where (x:listeLinks,listeRechts) = splittenV1 (n-1) xs \sourceoff mfg cx


   Profil
ligning
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 07.12.2014
Mitteilungen: 3472
Wohnort: Berlin
  Beitrag No.8, eingetragen 2021-11-03

\quoteon(2021-11-03 18:05 - carlox in Beitrag No. 6) Wie muss es richtig geschrieben werden? \quoteoff Der zu exportierende Bezeichner ist Baum, nicht data Baum. Außerdem musst du noch Blatt und Knoten exportieren. Siehe vorheriger Beitrag wie das einfacher geht. \quoteon Bei where gibt es Problem: "Non-exhaustive patterns in (x : listeLinks, listeRechts)" Warum ? \quoteoff Weil das Pattern nur matcht, wenn die erste Komponente einen Kopf x hat, also eine nichtleere Liste ist, und du keinen weiteren Zweig hast, der den übrigen Fall matcht. Bei der let-Version hast du das nicht so, (listeLinks,listeRechts) matcht jedes Paar.


   Profil
carlox
Aktiv Letzter Besuch: in der letzten Woche
Dabei seit: 22.02.2007
Mitteilungen: 1407
  Beitrag No.9, vom Themenstarter, eingetragen 2021-11-03

\quoteon(2021-11-03 18:50 - ligning in Beitrag No. 8) \quoteon(2021-11-03 18:05 - carlox in Beitrag No. 6) Wie muss es richtig geschrieben werden? \quoteoff Der zu exportierende Bezeichner ist Baum, nicht data Baum. Außerdem musst du noch Blatt und Knoten exportieren. Siehe vorheriger Beitrag wie das einfacher geht. \quoteoff 1) Habe Folgendes hinzugefügt: module Myfunc_11 ( Baum, Blatt, Knoten, baumliste, ) where ... Trotzdem erscheint die Fehlermeldung unten. Ist es so schwer, das zu reparieren, bzw. wie macht man das ? \sourceon :load main_11.hs [1 of 2] Compiling Myfunc_11 ( Myfunc_11.hs, interpreted ) Myfunc_11.hs:9:3: error: Not in scope: type constructor or class `Blatt' | 9 | Blatt, | ^^^^^ Myfunc_11.hs:10:3: error: Not in scope: type constructor or class `Knoten' | 10 | Knoten, | ^^^^^^ Failed, no modules loaded. \sourceoff 2) \quoteon Weil das Pattern nur matcht, wenn die erste Komponente einen Kopf x hat, also eine nichtleere Liste ist, und du keinen weiteren Zweig hast, der den übrigen Fall matcht. \quoteoff Wie muß man where.. ergänzen, dass es funktioniert? mfg cx


   Profil
ligning
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 07.12.2014
Mitteilungen: 3472
Wohnort: Berlin
  Beitrag No.10, eingetragen 2021-11-03

\quoteon(2021-11-03 19:31 - carlox in Beitrag No. 9) Habe Folgendes hinzugefügt: module Myfunc_11 ( Baum, Blatt, Knoten, baumliste, ) where ... \quoteoff OK, dann mach doch Baum(..) statt die Konstruktoren einzeln aufzulisten. Vielleicht muss man die Konstruktoren da in der Klammer aufführen, wenn man nicht alle exportieren will, weiß ich gerade nicht genau. \quoteon \quoteon Weil das Pattern nur matcht, wenn die erste Komponente einen Kopf x hat, also eine nichtleere Liste ist, und du keinen weiteren Zweig hast, der den übrigen Fall matcht. \quoteoff Wie muß man where.. ergänzen, dass es funktioniert? \quoteoff Nicht ergänzen, sondern einfach genauso wie beim let: \sourceon Haskell ... where (listeLinks,listeRechts) = splitten (n-1) \sourceoff Wär mir BTW ganz recht, wenn das auch jemand gegencheckt was ich hier behaupte, ich kann das wie gesagt nicht ausprobieren :-) Gerade bei where über Definitionen mit mehreren Gleichungen bin ich mir immer unsicher.


   Profil
carlox
Aktiv Letzter Besuch: in der letzten Woche
Dabei seit: 22.02.2007
Mitteilungen: 1407
  Beitrag No.11, vom Themenstarter, eingetragen 2021-11-04

Hallo allerseits, Gerade versuche ich eine Funktion (besser mehrere Versionen) contains x liste zu programmieren, die nachprüft, ob die Liste liste das Zeichen x enthält. 1. Lösungsversuch: a) Wie kann man die Bedingung y!=x in der Funktion unterbringen (siehe Quellcode) b) Wie bekomme ich die Fehlermeldungen weg ? // Fehlermeldungen \sourceon ghci> :load main_13.hs [1 of 2] Compiling Myfunc_13 ( Myfunc_13.hs, interpreted ) Myfunc_13.hs:7:11: error: * Conflicting definitions for `x' Bound at: Myfunc_13.hs:7:11 Myfunc_13.hs:7:14 * In an equation for `enthaelt1' | 7 | enthaelt1 x (x:[]) = True | ^^^^ Failed, no modules loaded.\sourceoff \sourceoff \sourceon import Myfunc_13 main = do print (enthaelt1 'z' ['a','b','c']) \sourceoff \sourceon module Myfunc_13 ( enthaelt1, ) where enthaelt1 :: Char -> [Char] -> Bool enthaelt1 x [] = False enthaelt1 x (x:[]) = True enthaelt1 y (x:[]) = False -- Wie realsiert man die Bedingung y != x ???? enthaelt1 z (x:xs) = enthaelt1 z xs \sourceoff 2. Lösungsversuch: Hier habe ich versucht viele Fallunterscheidungen innerhalb der Funktion zu machen (habe das irgendwo abgeschaut). Leider gibt es da jede Menge Fehlermeldungen. Was mache ich falsch bzw. wie macht man es richtig? // Fehlermeldungen \sourceon ghci> :load main_14.hs [1 of 2] Compiling Myfunc_14 ( Myfunc_14.hs, interpreted ) Myfunc_14.hs:8:11: error: Variable not in scope: x :: Char | 8 | | z==x && liste==(x:[]) = True | ^ Myfunc_14.hs:8:24: error: Variable not in scope: x :: Char | 8 | | z==x && liste==(x:[]) = True | ^ Myfunc_14.hs:9:9: error: * Variable not in scope: (!=) :: Char -> Bool -> Bool * Perhaps you meant one of these: `>=' (imported from Prelude), `==' (imported from Prelude), `/=' (imported from Prelude) | 9 | | z!=x && liste==(x:[]) = False | ^^ Myfunc_14.hs:9:11: error: Variable not in scope: x :: Bool | 9 | | z!=x && liste==(x:[]) = False | ^ Myfunc_14.hs:9:24: error: Variable not in scope: x :: Char | 9 | | z!=x && liste==(x:[]) = False | ^ Myfunc_14.hs:10:16: error: Variable not in scope: x :: Char | 10 | | liste==(x:xs) = enthaelt2 z xs | ^ Myfunc_14.hs:10:18: error: Variable not in scope: xs :: [Char] | 10 | | liste==(x:xs) = enthaelt2 z xs | ^^ Myfunc_14.hs:10:46: error: Variable not in scope: xs :: [Char] | 10 | | liste==(x:xs) = enthaelt2 z xs | ^^ Failed, no modules loaded. \sourceoff \sourceon import Myfunc_14 main = do print (enthaelt2 'z' ['a','b','c']) \sourceoff \sourceon module Myfunc_14 ( enthaelt2, ) where enthaelt2 :: Char -> [Char] -> Bool enthaelt2 z liste | liste == [] = False | z==x && liste==(x:[]) = True | z!=x && liste==(x:[]) = False | liste==(x:xs) = enthaelt2 z xs \sourceoff mfg cx


   Profil
carlox
Aktiv Letzter Besuch: in der letzten Woche
Dabei seit: 22.02.2007
Mitteilungen: 1407
  Beitrag No.12, vom Themenstarter, eingetragen 2021-11-04

\quoteon OK, dann mach doch Baum(..) statt die Konstruktoren einzeln aufzulisten. Vielleicht muss man die Konstruktoren da in der Klammer aufführen, wenn man nicht alle exportieren will, weiß ich gerade nicht genau. \quoteoff Vielen Dank Danke für den Tipp. Es funktioniert jetzt. Auch die Sache mit where geht jetzt. Hier der Quellcoede mit Aufruf: \sourceon ghci> :load main_15.hs [1 of 2] Compiling Myfunc_15 ( Myfunc_15.hs, interpreted ) [2 of 2] Compiling Main ( main_15.hs, interpreted ) Ok, two modules loaded. ghci> main [5] [2,1,3] ghci> \sourceoff \sourceon import Myfunc_15 main = do print (baumliste (Blatt 5)) print (baumliste (Knoten (Knoten (Blatt 2) (Blatt 1)) (Blatt 3) ) ) \sourceoff \sourceon module Myfunc_15 ( Baum (Blatt, Knoten), baumliste, ) where {- rekursiver Datentyp Design des Baums: Jedes Blatt hat einen Integer-Wert und der Baum besteht aus einem linken und rechten Unterbaum. -} data Baum = Blatt Int | Knoten Baum Baum baumliste :: Baum -> [Int] baumliste (Blatt a) = [a] baumliste (Knoten a b) = (baumliste a) ++ (baumliste b) \sourceoff mfg cx


   Profil
ligning
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 07.12.2014
Mitteilungen: 3472
Wohnort: Berlin
  Beitrag No.13, eingetragen 2021-11-04

\quoteon(2021-11-04 10:59 - carlox in Beitrag No. 11) 1. Lösungsversuch: a) Wie kann man die Bedingung y!=x in der Funktion unterbringen (siehe Quellcode) \quoteoff Der Operator heißt /= \quoteon b) Wie bekomme ich die Fehlermeldungen weg ? \quoteoff Erstmal solltest du die Fehlermeldungen überhaupt mal lesen und versuchen zu verstehen: \sourceon * Conflicting definitions for `x' Bound at: Myfunc_13.hs:7:11 Myfunc_13.hs:7:14 * In an equation for `enthaelt1' | 7 | enthaelt1 x (x:[]) = True | ^^^^ \sourceoff Die Fehlermeldung sagt, dass da zwei widersprechende Definitionen für x sind. Das ist sicher auch kein Versehen deinerseits, sondern das hast du dir so mit dem Hintergedanken überlegt, dass das Pattern nur matcht wenn beide Auftreten von x mit demselben Wert belegt werden. Nun sagt dir der Compiler, dass das nicht funktioniert, also kann man daraus zwei mögliche Schlüsse ziehen: Entweder, das geht überhaupt nicht, und man muss zwei verschiedene Variablen benutzen und diese mit == vergleichen; oder es geht, aber mit besonderer Syntax. Ersteres ist m.W. der Fall. \quoteon 2. Lösungsversuch: Hier habe ich versucht viele Fallunterscheidungen innerhalb der Funktion zu machen (habe das irgendwo abgeschaut). Leider gibt es da jede Menge Fehlermeldungen. Was mache ich falsch bzw. wie macht man es richtig? \quoteoff Variablen können nur in einem Pattern eingeführt werden. Nicht in beliebigen Ausdrücken, auch nicht in Guards. (Sorry für die Anglizismen.) Also wenn du die Bedingung liste==(x:[]) irgendwo hast, heißt das noch lange nicht, dass an der Stelle eine Variable x eingeführt wird. Das: \sourceon Haskell enthaelt2 :: Char -> [Char] -> Bool enthaelt2 z liste | liste == [] = False -- prinzipiell OK | z==x && liste==(x:[]) = True -- was ist x? | z!=x && liste==(x:[]) = False -- was ist x? | liste==(x:xs) = enthaelt2 z xs -- was sind x und xs? \sourceoff Schreibt man also besser so: \sourceon Haskell enthaelt2 :: Char -> [Char] -> Bool enthaelt2 _ [] = False enthaelt2 x (y:ys) = x == y || enthaelt2 x ys \sourceoff Das Pattern _ matcht auf alles und führt keine Variable ein. Damit kann man verhindern, dass eine unbenutzte Variable eingeführt wird, die dann zu ratlosen Gesichtern und Compilerwarnungen führt. [Die Antwort wurde nach Beitrag No.11 begonnen.]


   Profil
tactac
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 15.10.2014
Mitteilungen: 2552
  Beitrag No.14, eingetragen 2021-11-04

\quoteon(2021-11-03 20:08 - ligning in Beitrag No. 10) Wär mir BTW ganz recht, wenn das auch jemand gegencheckt was ich hier behaupte, ich kann das wie gesagt nicht ausprobieren :-) \quoteoff \quoteon(2021-11-04 11:59 - ligning in Beitrag No. 13) Variablen können nur in einem Pattern eingeführt werden. Nicht in beliebigen Ausdrücken, auch nicht in Guards. \quoteoff Es gibt auch "Pattern-Guards". \sourceon Haskell foo x y | Just v <- lookup x env, Just w <- lookup y env = bar v w | otherwise = baz x y \sourceoff (Die "normalen" Guards, die nur aus einem Booleschen Ausdruck e bestehen, könnte man als Pattern-Guard so schreiben: True <- e.)


   Profil
carlox
Aktiv Letzter Besuch: in der letzten Woche
Dabei seit: 22.02.2007
Mitteilungen: 1407
  Beitrag No.15, vom Themenstarter, eingetragen 2021-11-04

\quoteon Es gibt auch "Pattern-Guards". \quoteoff Ja, das ist aber vermutlich etwas für Fortgeschrittene. Ich habe unten jetzt meinen Quellcode so abgeändert, dass er lauffähig ist: \sourceon ghci> :load main_10.hs [1 of 2] Compiling Myfunc_10 ( Myfunc_10.hs, interpreted ) [2 of 2] Compiling Main ( main_10.hs, interpreted ) Ok, two modules loaded. ghci> main 144 5 100 30 [1,2,3,4,5,11,13,17,19,23,27] 5 5 [20,40,60,80] (200,60) [5,4,13,17] [5] [2,1,3] "abcdefghijklm" ("abc","defghijklm") ("a","bc") ("a","bc") ("abcd","efgh") False True False False \sourceoff // main_10.hs \sourceon {- ACHTUNG: Importiertes Modul am Anfang mit Grossbuchstabe -} import Myfunc_10 main = do print(fib 10) print (laenge [1,2,3,4,5]) print (laengensumme [10,20,30,40]) -- Eine Menge wird wie in der Mathematik angegeben print (laengensumme [x | x <- [1..10], mod(x*x) 2 == 0]) -- Anfügen einer Lsite an die andere mit ++ aus der Haskell-Library print ([1,2,3,4,5]++[11,13,17,19,23,27]) print (laenge ['a','b','x','c','d']) print (laenge "abcde") print (listemalzwei [10,20,30,40]) print (rechteckberechnung (10,20)) print (addliste [5,4] [13,17]) print (baumliste (Blatt 5)) print (baumliste (Knoten (Knoten (Blatt 2) (Blatt 1)) (Blatt 3) ) ) -- eine Liste von aufeinanderfolgenden Zeicnen print ['a','b'..'m'] print (splitten 3 ['a','b'..'m']) print (splitten 1 ['a','b','c']) print (splittenV1 1 ['a','b','c']) print (splittenV1 4 ['a','b','c','d','e','f','g','h']) print (enthaelt1 'z' ['a','b','c']) print (enthaelt2 'c' ['a','b','c']) print (enthaelt3 'z' ['a','b','c']) print (enthaelt4 'z' ['a','b','c']) \sourceoff // myfunc_10.hs \sourceon {- ACHTUNG: Importiertes Modul am Anfang mit Grossbuchstabe -} module Myfunc_10 ( fib, laenge, laengensumme, listemalzwei, rechteckberechnung, addliste, Baum (Blatt, Knoten), baumliste, splitten, splittenV1, enthaelt1, enthaelt2, enthaelt3, enthaelt4, ) where fib :: Int -> Int fib n | (n==0) = 1 | (n==1) = 2 | otherwise = fib (n-1) + fib(n-2) -- Berechnet die Länge einer Liste -- Beispiel: [10,20,30,40] --> 4 laenge :: [a] -> Int laenge [] = 0 laenge (x:xs) = 1 + laenge xs -- Berechnet die Summe der Zahlenwerte einer Liste aus Zahlen -- Beispiel: [10,20,30,40] --> 10+20+30+40 = 100 laengensumme :: [Int] -> Int laengensumme [] = 0 laengensumme (x:xs) = x + laengensumme xs -- Wert einer Liste verdoppeln listemalzwei :: (Num a) => [a] -> [a] listemalzwei [] = [] listemalzwei (x:xs) = 2*x : listemalzwei xs -- 2 Listen gleichen Typs aneinanderfügen addliste :: [a] -> [a] -> [a] addliste [] liste = liste addliste (x:xs) liste = x : addliste xs liste -- Fläche und Umfang eines Rechtecks berechnen -- Dabei werden Tupel verwendet, um 2 Rückgabewerte zu erzeugen rechteckberechnung :: (Int, Int) -> (Int, Int) rechteckberechnung (a,b) = (a*b, 2*a+2*b) {- rekursiver Datentyp Design des Baums: Jedes Blatt hat einen Integer-Wert und der Baum besteht aus einem linken und rechten Unterbaum. -} data Baum = Blatt Int | Knoten Baum Baum baumliste :: Baum -> [Int] baumliste (Blatt a) = [a] baumliste (Knoten a b) = (baumliste a) ++ (baumliste b) -- eine Liste an der Stelle n splitten splitten :: Int -> [a] -> ([a] , [a]) splitten 0 liste = ([] , liste) splitten n [] = ([] , []) splitten n (x:xs) = let (listeLinks,listeRechts) = splitten (n-1) xs in (x:listeLinks,listeRechts) -- alternative Version : eine Liste an der Stelle n splitten splittenV1 :: Int -> [a] -> ([a] , [a]) splittenV1 0 liste = ([] , liste) splittenV1 n [] = ([] , []) splittenV1 n (x:xs) = (x:listeLinks,listeRechts) where (listeLinks,listeRechts) = splittenV1 (n-1) xs enthaelt1 :: Eq a => a -> [a] -> Bool enthaelt1 y [] = False enthaelt1 y (x:xs) = if (x == y) then True else enthaelt1 y xs enthaelt2 :: Char -> [Char] -> Bool enthaelt2 _ [] = False enthaelt2 x (y:ys) = x == y || enthaelt2 x ys enthaelt3 :: Char -> [Char] -> Bool -- Der Underscore steht für eine Wildcard, die alles matcht --enthaelt3 _ [] = False -- Statt der Wildcard kann man auch eine Variable nehmen enthaelt3 z [] = False enthaelt3 x (y:ys) = if(x == y) then True else enthaelt3 x ys enthaelt4 :: Char -> [Char] -> Bool enthaelt4 x liste | x /= head liste = False | x == head liste = True | otherwise = enthaelt4 x (tail liste) \sourceoff mfg cx


   Profil
ligning
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 07.12.2014
Mitteilungen: 3472
Wohnort: Berlin
  Beitrag No.16, eingetragen 2021-11-04

enthaelt4 ist noch falsch. Erstens gibts einen Laufzeitfehler, wenn head mit einer leeren Liste aufgerufen wird. Und normalerweise sollte das bei einem rekursiven Algorithmus ja immer irgendwann passieren. Bei dir aber nicht, also zweitens: Es wird bei einer nichtleeren Liste nur das erste Element gecheckt. Der otherwise-Zweig wird nie erreicht.


   Profil
carlox
Aktiv Letzter Besuch: in der letzten Woche
Dabei seit: 22.02.2007
Mitteilungen: 1407
  Beitrag No.17, vom Themenstarter, eingetragen 2021-11-04

\quoteon(2021-11-04 15:06 - ligning in Beitrag No. 16) enthaelt4 ist noch falsch. Erstens gibts einen Laufzeitfehler, wenn head mit einer leeren Liste aufgerufen wird. Und normalerweise sollte das bei einem rekursiven Algorithmus ja immer irgendwann passieren. Bei dir aber nicht, also zweitens: Es wird bei einer nichtleeren Liste nur das erste Element gecheckt. Der otherwise-Zweig wird nie erreicht. \quoteoff Du hast Recht! Ich war so auf die Syntax fixiert... Hier hoffentlich die richtige Lösung: \sourceon enthaelt4 :: Char -> [Char] -> Bool enthaelt4 x liste -- /= bedeutet ungleich | liste==[] = False | x /= head liste && liste==(head liste):[] = False | x == head liste = True | otherwise = enthaelt4 x (tail liste) \sourceoff Eine Frage: Bei jedem senkrechten Strich wird zur Laufzeit - von oben aus begonnen - nach unten gegangen und geprüft, welches "Pattern" (Muster) matcht. Was geschieht, wenn es theoretisch mehrmals matchen kann ? mfg cx


   Profil
ligning
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 07.12.2014
Mitteilungen: 3472
Wohnort: Berlin
  Beitrag No.18, eingetragen 2021-11-04

Kann man so machen, aber schön ist das nicht. Ich würde den komplizierten Zweig weglassen. Falls die Liste nur ein Element enthält, das ungleich x ist, passiert doch im otherwise-Zweig genau das richtige. Zu deiner Pattern-Matching-Frage: Es wird solange von oben nach unten ausgewertet, bis eins zutrifft, und dann gestoppt. Bei dir sind es zwar keine Patterns, sondern Guards (Bedingungen), aber da gilt das gleiche.


   Profil
carlox
Aktiv Letzter Besuch: in der letzten Woche
Dabei seit: 22.02.2007
Mitteilungen: 1407
  Beitrag No.19, vom Themenstarter, eingetragen 2021-11-04

Hallo allerseits, mit welcher Funktion kann man auf das i-te Element eies Tupels (t1,t2,...,tn) zugreifen? Habe bis jetzt nur Funktionen für ein Tupel der Länge 2 gefunden. mfg cx


   Profil
ligning
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 07.12.2014
Mitteilungen: 3472
Wohnort: Berlin
  Beitrag No.20, eingetragen 2021-11-04

Da gibt es nichts eingebautes. Tupel bearbeitet man am besten mit Pattern Matching, und allzu lange Tupel sollte man sowieso nicht verwenden.


   Profil
__blackjack__
Wenig Aktiv Letzter Besuch: vor mehr als 3 Monaten
Dabei seit: 23.09.2021
Mitteilungen: 81
  Beitrag No.21, eingetragen 2021-11-04

Da gibt es soweit ich weiss nichts in der Standardbibliothek. Pattern matching geht. Und wenn Tupel zu viele Elemente enthalten, sollte man überlegen ob das noch richtig strukturiert ist, denn wenn man anfängt zu überlegen ob nun das 15. oder das 16. Element der Kilometerstand des Fahrzeugs ist, was man versucht mit einem Tupel zu modellieren, dann ist man auf dem Holzweg. :-) [Die Antwort wurde nach Beitrag No.19 begonnen.]


   Profil
carlox
Aktiv Letzter Besuch: in der letzten Woche
Dabei seit: 22.02.2007
Mitteilungen: 1407
  Beitrag No.22, vom Themenstarter, eingetragen 2021-11-04

\quoteon(2021-11-04 19:46 - __blackjack__ in Beitrag No. 21) Da gibt es soweit ich weiss nichts in der Standardbibliothek. Pattern matching geht. \quoteoff Kannst du mir das bitte an einem Beispiel zeigen? mfg cx


   Profil
ligning
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 07.12.2014
Mitteilungen: 3472
Wohnort: Berlin
  Beitrag No.23, eingetragen 2021-11-04

Angenommen, du reichst ein 5-Tupel in eine Funktion und willst das 3. und 4. Element extrahieren (welche Int sind), diese addieren und zurückgeben. \sourceon Haskell addThirdAndFourth :: (a, b, Int, Int, c) -> Int addThirdAndFourth (_, _, x, y, _) = x + y \sourceoff Haskell


   Profil
tactac
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 15.10.2014
Mitteilungen: 2552
  Beitrag No.24, eingetragen 2021-11-04

\(\begingroup\)\(\newcommand{\sem}[1]{[\![#1]\!]} \newcommand{\name}[1]{\ulcorner#1\urcorner} \newcommand{\upamp}{\mathbin {⅋}}\) \quoteon(2021-11-04 20:21 - carlox in Beitrag No. 22) \quoteon(2021-11-04 19:46 - __blackjack__ in Beitrag No. 21) Da gibt es soweit ich weiss nichts in der Standardbibliothek. Pattern matching geht. \quoteoff Kannst du mir das bitte an einem Beispiel zeigen? \quoteoff Beispiel für $n=9$: \sourceon Haskell sevenOfNine :: (a,b,c,d,e,f,g,h,i) -> g sevenOfNine (_,_,_,_,_,_,g,_,_) = g \sourceoff [Die Antwort wurde nach Beitrag No.22 begonnen.]\(\endgroup\)


   Profil
carlox
Aktiv Letzter Besuch: in der letzten Woche
Dabei seit: 22.02.2007
Mitteilungen: 1407
  Beitrag No.25, vom Themenstarter, eingetragen 2021-11-04

\quoteon Da gibt es soweit ich weiss nichts in der Standardbibliothek. \quoteoff Dann will ich selbst eine Funktion schreiben. Gibt es bei Tupeln auch so etwas wie bei Listen: (h:t) Oder wie kann man da zugreifen ? mfg cx


   Profil
ligning
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 07.12.2014
Mitteilungen: 3472
Wohnort: Berlin
  Beitrag No.26, eingetragen 2021-11-04

Nein, gibt es nicht. Wie man zugreift hast du doch jetzt schon ausreichend gesehen.


   Profil
tactac
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 15.10.2014
Mitteilungen: 2552
  Beitrag No.27, eingetragen 2021-11-04

\quoteon(2021-11-04 21:49 - carlox in Beitrag No. 25) Dann will ich selbst eine Funktion schreiben. Gibt es bei Tupeln auch so etwas wie bei Listen: (h:t) Oder wie kann man da zugreifen ? \quoteoff Es gibt sowas: (h:t) ist ein Muster, das sich aus einem der Wertkonstruktoren ergibt. Im selben Sinn ist Knoten x y bei deinen Bäumen ein Muster, und bei Tupeltypen gibt es die Muster (x,y), (x,y,z), (w,x,y,z) usw.


   Profil
carlox
Aktiv Letzter Besuch: in der letzten Woche
Dabei seit: 22.02.2007
Mitteilungen: 1407
  Beitrag No.28, vom Themenstarter, eingetragen 2021-11-05

Es hat geklappt: Habe eine Funktion geschrieben, die von einem 3-e Tupel aus Chars durch einen Index das zugehörige Zeichen liefert. Doch jetzt wird es komplizierter: Ich will aus einem 3er-Tupel mit den verschiedenen Datentypen: [Char], Char, [Char] ein bestimmtes Zeichen (durch Angabe eines Index) herausfischen also entweder [Char] oder Char oder [Char]) Informal beschrieben (aber nicht Haskellkonform): (Das Problem ist meine Bezeichnung "Variabler Datentyp") \sourceon indexS3 :: Int -> ([Char], Char, [Char]) -> "Variabler Datentyp" indexS3 i (a,b,c) | i==0 = a | i==1 = b | i==2 = c \sourceoff Wie macht man das in Haskell? mfg cx


   Profil
tactac
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 15.10.2014
Mitteilungen: 2552
  Beitrag No.29, eingetragen 2021-11-05

\quoteon(2021-11-05 11:21 - carlox in Beitrag No. 28) Informal beschrieben (aber nicht Haskellkonform): (Das Problem ist meine Bezeichnung "Variabler Datentyp") \sourceon indexS3 :: Int -> ([Char], Char, [Char]) -> "Variabler Datentyp" indexS3 i (a,b,c) | i==0 = a | i==1 = b | i==2 = c \sourceoff Wie macht man das in Haskell? \quoteoff Ein geeigneter Indextyp hilft. \sourceon Haskell {-# LANGUAGE GADTs #-} data J3 a b c d where J3_0 :: J3 a b c a J3_1 :: J3 a b c b J3_2 :: J3 a b c c indexS3 :: J3 a b c t -> (a,b,c) -> t indexS3 i (a,b,c) = case i of J3_0 -> a J3_1 -> b J3_2 -> c \sourceoff Wie sinnvoll das ist, sei mal dahingestellt. 😁


   Profil
carlox
Aktiv Letzter Besuch: in der letzten Woche
Dabei seit: 22.02.2007
Mitteilungen: 1407
  Beitrag No.30, vom Themenstarter, eingetragen 2021-11-05

Hallo tactac, du benutzt das in deinem Vorschlag reservierte Wort data. Das musste ich erst mal recherchieren: https://mmhaskell.com/blog/2017/12/24/haskell-data-types-in-5-steps I) Habe Folgendes (siehe unten) mit data experimentiert: a) Wie muss man es richtig machen, so dass es keine Fehlermeldungen mehr gibt? b) Wie verwendet man print, um die Daten "Jane Doe" 38 300000 auf dem Bildschirm auszugeben ? // Fehlermeldungen \sourceon ghci> :load main_17.hs [1 of 2] Compiling Myfunc_17 ( Myfunc_17.hs, interpreted ) [2 of 2] Compiling Main ( main_17.hs, interpreted ) main_17.hs:6:17: error: Not in scope: type constructor or class `Employee' | 6 | employee1 :: Employee | ^^^^^^^^ main_17.hs:7:4: error: The last statement in a 'do' block must be an expression let employee1 = Executive "Jane Doe" 38 300000 | 7 | let employee1 = Executive "Jane Doe" 38 300000 | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Failed, one module loaded. \sourceoff // main_17.hs \sourceon import Myfunc_17 main = do print(fib 10) employee1 :: Employee let employee1 = Executive "Jane Doe" 38 300000 \sourceoff // myfunc_17.hs \sourceon module Myfunc_17 ( fib, Baum (Blatt, Knoten), baumliste, -- Employee ) where fib :: Int -> Int fib n | (n==0) = 1 | (n==1) = 2 | otherwise = fib (n-1) + fib(n-2) data Baum = Blatt Int | Knoten Baum Baum baumliste :: Baum -> [Int] baumliste (Blatt a) = [a] baumliste (Knoten a b) = (baumliste a) ++ (baumliste b) data Employee = Executive String Int Int \sourceoff II) In dem Link oben werden verschiedene Möglichkeiten angegeben, um data zu verwenden. a) data Employee = Executive String Int Int b) data Employee = Executive String Int Int | VicePresident String String Int | Manager String String | Engineer String Int c) So etwas habe ich auch schon gesehen: data Farbe = gelb | blau | rot Leider verstehe ich das nur so ungefähr. Kennst du eine Quelle, in der das ausführlich erklärt wird ? mfg cx


   Profil
tactac
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 15.10.2014
Mitteilungen: 2552
  Beitrag No.31, eingetragen 2021-11-05

I) a) Employee muss in der Export-Liste auftauchen, und, wie die zweite Fehlermeldung sagt: Ein do-Block darf nicht mit einem let oder pattern <- whatetever enden, sonden muss an letzter Stelle einen gewöhnlichen Ausdruck haben. b) print verwendet hinter den Kulissen die Methode show der Typklasse Show. Man kann Instanzen selber deklarieren (toplevel instance Show Employee where show = ... irgendwo) oder sie automatisch berechnen lassen (mit deriving(Show) am Ende der mit data beginnenden Datentypdeklaration). II) Ausführlich (aber vielleicht nicht unbedingt "erklärt") ist das natürlich in der Spezifikation. Mehr Erklärung und weniger Ausführlichkeit gibt's vielleicht hier. Ich möchte noch betonen, dass "GADTs", die ich in #29 verwendet habe, noch nicht offiziell Standard sind (und man deshalb in Quelltext für GHC sowas wie {-# LANGUAGE GADTs #-} zur Aktivierung an den Anfang schreiben muss), aber trotzdem (fast unweigerlich) von vielen nichttrivialen Projekten benutzt werden.


   Profil
tactac
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 15.10.2014
Mitteilungen: 2552
  Beitrag No.32, eingetragen 2021-11-06

\quoteon(2021-11-05 11:21 - carlox in Beitrag No. 28) Doch jetzt wird es komplizierter: Ich will aus einem 3er-Tupel mit den verschiedenen Datentypen: [Char], Char, [Char] ein bestimmtes Zeichen (durch Angabe eines Index) herausfischen also entweder [Char] oder Char oder [Char]) Informal beschrieben (aber nicht Haskellkonform): (Das Problem ist meine Bezeichnung "Variabler Datentyp") \sourceon indexS3 :: Int -> ([Char], Char, [Char]) -> "Variabler Datentyp" indexS3 i (a,b,c) | i==0 = a | i==1 = b | i==2 = c \sourceoff Wie macht man das in Haskell? \quoteoff Vielleicht nochmal eine Bemerkung hierzu. Das Typsystem von Haskell ist von Grund auf eigentlich nicht dazu gemacht, solche Dinge in natürlicher Weise auszudrücken (An GHC interessierte versuchen aber, die Lücke zu schließen). Das Vorurteil, eine Phasenunterscheidung zwischen Compiletime und Runtime durchführen zu wollen (und anderer historischer Ballast), schlägt hier sehr schwer zu Buche. In Lean könnte man einfach sagen: \sourceon Lean -- wir nehmen mit beliebigen Typen I indizierte Produkte variable {I : Type} variable {T : I → Type} def index_1(i : I)(tuple: Π i : I, T i): T i := tuple i -- dieselbe Funktion wie index_1, nur anders hingeschrieben def index_2: Π i : I, (Π i : I, T i) → T i := λ i tuple, tuple i -- legt Vertauschen der Argumente nah: def index_3: (Π i : I, T i) → Π i : I, T i := λ tuple i, tuple i -- Haskell-artigere Syntax (v.a.: ggf. mehrere Musterkombinationen links vom ':=' (hier aber nur eine)): def index_3': (Π i : I, T i) → Π i : I, T i | tuple i := tuple i -- also (!): def index_4: (Π i : I, T i) → Π i : I, T i := id --bzw.: def index_5(tuple: Π i, T i)(i : I): T i := tuple i \sourceoff


   Profil
carlox
Aktiv Letzter Besuch: in der letzten Woche
Dabei seit: 22.02.2007
Mitteilungen: 1407
  Beitrag No.33, vom Themenstarter, eingetragen 2021-11-06

\quoteon Ich möchte noch betonen, dass "GADTs", die ich in #29 verwendet habe, noch nicht offiziell Standard sind ... \quoteoff Geht das auch ohne "GADTs" und wenn ja wie ? mfg cx


   Profil
tactac
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 15.10.2014
Mitteilungen: 2552
  Beitrag No.34, eingetragen 2021-11-06

\quoteon(2021-11-06 12:18 - carlox in Beitrag No. 33) Geht das auch ohne "GADTs" und wenn ja wie ? \quoteoff Nein.


   Profil
carlox
Aktiv Letzter Besuch: in der letzten Woche
Dabei seit: 22.02.2007
Mitteilungen: 1407
  Beitrag No.35, vom Themenstarter, eingetragen 2021-11-06

Hallo allerseits, um mit data etwas zu experimentieren, habe ich folgendes Beispüiel gefunden: https://mmhaskell.com/liftoff/data-types ------------------ data Task1 = BasicTask1 String Int | ComplexTask1 String Int Location ... complexTask :: Task1 complexTask = ComplexTask1 "Write Memo" 30 Office --------------------- Ich will nun die Daten: ComplexTask1 "Write Memo" 30 Office auf dem Bildschirm ausgeben. Eigentlich funktioniert alles, aber Probleme macht die Deklaration: complexTask :: Task1 im main = do - Block. Kann mir jemand eine Demo-Programm geben, wo man im main=do - Block eine Deklaration angeben kann oder ist das gar nicht möglich ? mfg cx


   Profil
tactac
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 15.10.2014
Mitteilungen: 2552
  Beitrag No.36, eingetragen 2021-11-06

Variablenbindungen mit Typangaben in do-Blöcken gehen zum Beispiel so (gleich mal etwas komplexer mit mehreren Bindungen): \sourceon Haskell main = do print "Start" let complexTask :: Task1 loc :: Location complexTask = ComplexTask1 "Write Memo" 30 loc loc = Office print complexTask \sourceoff Aber etwas besser wäre es, wenn es geht (und hier geht's), die Variablen außerhalb des do-Blocks zu belegen. \sourceon Haskell main = do print "Start" print complexTask where complexTask :: Task1 loc :: Location complexTask = ComplexTask1 "Write Memo" 30 loc loc = Office \sourceoff


   Profil
carlox
Aktiv Letzter Besuch: in der letzten Woche
Dabei seit: 22.02.2007
Mitteilungen: 1407
  Beitrag No.37, vom Themenstarter, eingetragen 2021-11-07

\quoteon(2021-11-06 20:49 - tactac in Beitrag No. 36) Variablenbindungen mit Typangaben in do-Blöcken gehen zum Beispiel so (gleich mal etwas komplexer mit mehreren Bindungen): \sourceon Haskell main = do print "Start" let complexTask :: Task1 loc :: Location complexTask = ComplexTask1 "Write Memo" 30 loc loc = Office print complexTask \sourceoff \quoteoff Danke für den Tipp. Leider vertshe ich nicht, was da gemacht wird. Hast du dazu Quellen? Habe den Quellcode von dir eingegeben. Dann kommt die Fehlermeldung: \sourceon main_101.hs:25:16: error: Not in scope: type constructor or class `Location' | 25 | loc :: Location | ^^^^^^^^ Failed, no modules loaded. \sourceoff Was muss ich machen, damit es klappt? mfg cx


   Profil
tactac
Senior Letzter Besuch: in der letzten Woche
Dabei seit: 15.10.2014
Mitteilungen: 2552
  Beitrag No.38, eingetragen 2021-11-07

\quoteon(2021-11-07 09:16 - carlox in Beitrag No. 37) Danke für den Tipp. Leider vertshe ich nicht, was da gemacht wird. Hast du dazu Quellen? \quoteoff Die Syntax kann man jedenfalls hier nachlesen: https://www.haskell.org/onlinereport/haskell2010/haskellch10.html#x17-18000010.5 \quoteon Habe den Quellcode von dir eingegeben. Dann kommt die Fehlermeldung: \sourceon main_101.hs:25:16: error: Not in scope: type constructor or class `Location' | 25 | loc :: Location | ^^^^^^^^ Failed, no modules loaded. \sourceoff Was muss ich machen, damit es klappt? \quoteoff Der Typ „Location“ muss verfügbar sein. \quoteoff


   Profil
carlox
Aktiv Letzter Besuch: in der letzten Woche
Dabei seit: 22.02.2007
Mitteilungen: 1407
  Beitrag No.39, vom Themenstarter, eingetragen 2021-11-07

Hallo allerseits, was muss ich machen, dass print keine Fehlermeldung mehr erzeugt? \sourceon ghci> :load main_17.hs [1 of 2] Compiling Myfunc_17 ( Myfunc_17.hs, interpreted ) [2 of 2] Compiling Main ( main_17.hs, interpreted ) main_17.hs:6:3: error: * No instance for (Show ([([Char], [Char], [Char])] -> ([Char], [Char], [Char]))) arising from a use of `print' (maybe you haven't applied a function to enough arguments?) * In a stmt of a 'do' block: print (test 'x', [("ab", "cd", "ef"), ("gh", "ij", "kl")]) In the expression: do print ("Hallo") print (test 'x', [("ab", "cd", "ef"), ("gh", "ij", "kl")]) In an equation for `main': main = do print ("Hallo") print (test 'x', [("ab", "cd", "ef"), ....]) | 6 | print (test 'x', [("ab","cd","ef"),("gh","ij","kl")]) | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Failed, one module loaded. \sourceoff \sourceon import Myfunc_17 main = do print ("Hallo") print (test 'x', [("ab","cd","ef"),("gh","ij","kl")]) \sourceoff \sourceon module Myfunc_17 ( index_3, test, ) where index_3 :: Int -> ([Char], [Char], [Char]) -> [Char] index_3 i (a,b,c) | i==0 = a | i==1 = b | i==2 = c test :: Char -> [([Char], [Char], [Char])] -> ([Char], [Char], [Char]) test z liste | length liste == 0 = ([],[],[]) | otherwise = ( [z]++(index_3 0 (liste !! 0)), index_3 0 (liste !! 0), index_3 0 (liste !! 0) ) \sourceoff mfg cx [Die Antwort wurde nach Beitrag No.37 begonnen.]


   Profil
-->> Fortsetzung auf der nächsten Seite -->>
Seite 1Gehe zur Seite: 1 | 2  

Wechsel in ein anderes Forum:
 Suchen    
 
All logos and trademarks in this site are property of their respective owner. The comments are property of their posters, all the rest © 2001-2022 by Matroids Matheplanet
This web site was originally made with PHP-Nuke, a former web portal system written in PHP that seems no longer to be maintained nor supported. PHP-Nuke is Free Software released under the GNU/GPL license.
Ich distanziere mich von rechtswidrigen oder anstößigen Inhalten, die sich trotz aufmerksamer Prüfung hinter hier verwendeten Links verbergen mögen.
Lesen Sie die Nutzungsbedingungen, die Distanzierung, die Datenschutzerklärung und das Impressum.
[Seitenanfang]