|
Autor |
Einige Fragen zu Übungen mit Haskell |
|
carlox
Aktiv  Dabei seit: 22.02.2007 Mitteilungen: 1390
 | 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  Dabei seit: 15.10.2014 Mitteilungen: 2533
 | 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  Dabei seit: 22.02.2007 Mitteilungen: 1390
 | 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  Dabei seit: 15.10.2014 Mitteilungen: 2533
 | 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  Dabei seit: 22.02.2007 Mitteilungen: 1390
 | 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  Dabei seit: 07.12.2014 Mitteilungen: 3451
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  Dabei seit: 22.02.2007 Mitteilungen: 1390
 | 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  Dabei seit: 22.02.2007 Mitteilungen: 1390
 | 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  Dabei seit: 07.12.2014 Mitteilungen: 3451
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  Dabei seit: 22.02.2007 Mitteilungen: 1390
 | 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  Dabei seit: 07.12.2014 Mitteilungen: 3451
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  Dabei seit: 22.02.2007 Mitteilungen: 1390
 | 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  Dabei seit: 22.02.2007 Mitteilungen: 1390
 | 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  Dabei seit: 07.12.2014 Mitteilungen: 3451
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  Dabei seit: 15.10.2014 Mitteilungen: 2533
 | 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  Dabei seit: 22.02.2007 Mitteilungen: 1390
 | 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  Dabei seit: 07.12.2014 Mitteilungen: 3451
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  Dabei seit: 22.02.2007 Mitteilungen: 1390
 | 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  Dabei seit: 07.12.2014 Mitteilungen: 3451
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  Dabei seit: 22.02.2007 Mitteilungen: 1390
 | 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  Dabei seit: 07.12.2014 Mitteilungen: 3451
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  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  Dabei seit: 22.02.2007 Mitteilungen: 1390
 | 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  Dabei seit: 07.12.2014 Mitteilungen: 3451
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  Dabei seit: 15.10.2014 Mitteilungen: 2533
 | 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  Dabei seit: 22.02.2007 Mitteilungen: 1390
 | 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  Dabei seit: 07.12.2014 Mitteilungen: 3451
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  Dabei seit: 15.10.2014 Mitteilungen: 2533
 | 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  Dabei seit: 22.02.2007 Mitteilungen: 1390
 | 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  Dabei seit: 15.10.2014 Mitteilungen: 2533
 | 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  Dabei seit: 22.02.2007 Mitteilungen: 1390
 | 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  Dabei seit: 15.10.2014 Mitteilungen: 2533
 | 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  Dabei seit: 15.10.2014 Mitteilungen: 2533
 | 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  Dabei seit: 22.02.2007 Mitteilungen: 1390
 | 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  Dabei seit: 15.10.2014 Mitteilungen: 2533
 | 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  Dabei seit: 22.02.2007 Mitteilungen: 1390
 | 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  Dabei seit: 15.10.2014 Mitteilungen: 2533
 | 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  Dabei seit: 22.02.2007 Mitteilungen: 1390
 | 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  Dabei seit: 15.10.2014 Mitteilungen: 2533
 | 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  Dabei seit: 22.02.2007 Mitteilungen: 1390
 | 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
|
|
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]
|