Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Chris2130

Frischling

  • »Chris2130« ist der Autor dieses Themas

Beiträge: 49

Wohnort: NRW

Beruf: Schüler

  • Private Nachricht senden

1

01.11.2013, 12:01

[Haskell] Maybe

Hallo,
ich bin gerade dabei mich in Haskell einzuarbeiten, jedoch komme ich leider nicht weiter.

Die Problemstellung lautet, dass eine Funktion maybemap entwickelt werden soll, welche eine Funktion f auf eine Liste von Maybes anwendet.


Quellcode

1
2
maybemap :: (a -> b) -> [Maybe a] -> [Maybe b]
maybemap f [] = [Nothing]


Soweit sieht mein Anfang aus, jedoch weiß ich nun nicht, wie ich die Funktion f auf die Liste von Maybes anwenden kann, ohne Fehler zu erhalten, evtl kann mir einer von euch auf die Sprünge helfen?

Meine Idee war eine IF-Abfrage, um zu sehen, ob die Funktion einen Fehler ausgibt und dann evtl Nothing auszugeben, allerdings will das nicht so ganz funktionieren:

Quellcode

1
2
 maybemap f (x:xs) = if(f x) then Just(f x):maybemap f xs
              else Nothing:maybemap f xs
~~~~~~~~~~~~~~

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

2

01.11.2013, 15:34

Das was du vorschlägst würde ja bedeuten, du möchtest eine Funktion auf die Liste anwenden und eine Liste zurück liefern mit den Objekten auf welche die Funktion True zurück liefert. Ansonsten halt Nothing. Ist das denn überhaupt das was du machen möchtest? Wenn ich höre eine Funktion auf eine Liste anwenden, dann würde ich das so verstehen, dass die Funkion auf jedes Element angewandt wird und der Rückgabewert in die rückgebende Liste eingefügt wird. Also ohne deine Abfrage.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

3

01.11.2013, 16:01

Vollkommen ungetestet (ich fuchse much gerade selbst erst rein):

Quellcode

1
2
3
4
map' :: (a -> b) -> Maybe a -> Maybe b
map' _ [] = []
map' f (Nothing:xs) = Nothing : map' f xs
map' f (x:xs) = Just (f (fromJust x)) : map' f xs

Zitat

Ich bin nicht der Messias.
Ich sage, du bist es, Herr. Und ich muss es wissen, denn ich bin schon einigen gefolgt.

https://bitbucket.org/bwbg

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »bwbg« (01.11.2013, 16:56)


Chris2130

Frischling

  • »Chris2130« ist der Autor dieses Themas

Beiträge: 49

Wohnort: NRW

Beruf: Schüler

  • Private Nachricht senden

4

01.11.2013, 17:20

Erstmal danke bwbg für den Codeschnippsel, der funktioniert soweit ;)

Mit der Abfrage, will ich den Spezialfall abfragen, dass die Funktion einen Fehler ausgibt. Statt dem Fehler, hätte ich gerne ein Nothing in der Liste. Nur leider hab ich bisher nichts gefunden, um den Fehler abzufangen.

Als Beispiel, wenn ich
map' (div 2) [Just 1,Just 2, Just 0] eingebe, kommt ein Fehler, da eine Division durch 0 nicht möglich ist und ich hätte gerne [Just 2, Just 1,Nothing]
~~~~~~~~~~~~~~

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

5

01.11.2013, 17:34

Das wird so nicht ohne weiteres gehen soweit ich das noch richtig im Kopf habe. Es gibt aber meine ich Exceptions die du abfangen kannst. Bei Error geht das nicht. So habe ich es zumindest im Kopf. Am besten suchst du mal nach den Stichworten und guckst was man da machen kann. Meine Haskell Skills sind ziemlich eingerostet;)
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

6

01.11.2013, 17:52

Wiederum ohne Gewähr (ich habe noch keinen Haskell-Interpreter für Android gefunden):

Quellcode

1
2
3
4
5
6
7
8
9
10
11
div' :: (Eq a, Integral a) => a -> a -> Maybe a
div' _ 0 = Nothing
div' x y = Just $ div x y

map' :: (a -> Maybe b) -> [Maybe a] -> [Maybe b]
map' _ [] = []
map' f (Nothing:xs) = Nothing : map' f xs
map' f (x:xs)
    | isNothing g = Nothing : map' f xs
    | otherwise   = g : map' f xs
    where g = f $ fromJust x


Du musst dafür sorgen, dass der Fehlerfall in div' eben auch Nothing zurück gibt und nicht mit error abbricht.

Darüber hinaus (bereits im ersten Beispiel bedacht), dass Maybe a breits Nothing sein kann.

Edit#1: Typ-Signatur von map' angepasst.
Edit#2: Da bisher keine Antwort auf den Beitrag folgte, habe ich den Quelltext getestet und korrigiert. Darüber hinaus habe ich den Code für map' noch etwas aufgeräumt (oder was ich dafür halte):

Quellcode

1
2
3
4
map'' :: (a -> Maybe b) -> [Maybe a] -> [Maybe b]
map'' _ [] = []
map'' f (Nothing:xs) = Nothing : map'' f xs
map'' f (Just x:xs) = f x : map'' f xs


Via GHCI:

Quellcode

1
2
3
4
5
6
*Main> let f = div' 2
*Main> let g = [Nothing, Just 1, Just 2, Just 0]
*Main> map' f g
[Nothing,Just 2,Just 1,Nothing]
*Main> map' f g == map'' f g
True


Danke an den OP, so konnte ich wieder etwas lernen ;)

Grüße ... bwbg

Zitat

Ich bin nicht der Messias.
Ich sage, du bist es, Herr. Und ich muss es wissen, denn ich bin schon einigen gefolgt.

https://bitbucket.org/bwbg

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »bwbg« (01.11.2013, 21:07)


Chris2130

Frischling

  • »Chris2130« ist der Autor dieses Themas

Beiträge: 49

Wohnort: NRW

Beruf: Schüler

  • Private Nachricht senden

7

03.11.2013, 18:59

Danke :)
~~~~~~~~~~~~~~

Werbeanzeige