Beispiel 8.2 unzipT - Typproblem

  • Hi,


    ich hab Bsp 2 jetzt auch fast fertig jedoch noch ein Typproblem.


    Ich habe eine Funktion unzipT die ihre Aufgabe erledigt, indem sie 2 Hilfsfunktionen aufruft.


    unzipT :: (Eq a, Eq b) => Tree (a,b) -> (Tree a,Tree b)
    unzipT x = (unzipTHelpL x (getFirst x), (unzipTHelpR x (getSecond x)) )


    unzipTHelpL und unzipTHelpR haben fast die gleiche Funktionalität.


    unzipTHelpL baut einen Baum mit dem ersten Element des Inhaltspaares und unzipTHelpR einen Baum mit dem zweiten Element des Inahltspaares.


    das 2te Argument, ist nur ein "Hilfsbaum", der als Start verwendet wird und zum Aufbauen gebraucht wird.


    unzipTHelpL hat folgende Signatur und funktioniert bereits:
    unzipTHelpL :: (Eq a, Eq b) => Tree (a,b) -> Tree a -> Tree a
    unzipTHelpL (Node (x,_) x1 x2) (Node y y1 y2)


    Für unzipTHelpR siechts so aus
    unzipTHelpR :: (Eq a, Eq b) => Tree (a,b) -> Tree b -> Tree b
    unzipTHelpR (Node (_,x) x1 x2) (Node y y1 y2)


    ich bekomm jedoch für unzipTHelpR folgende Fehlermeldung:


    ERROR file:C:\uni\sem5\funprog\Aufgabe8.hs:94 - Inferred type is not general enough
    *** Expression : unzipTHelpR
    *** Expected type : (Eq a, Eq b) => Tree (a,b) -> Tree b -> Tree b
    *** Inferred type : (Eq a, Eq a) => Tree (a,a) -> Tree a -> Tree a


    Habt ihr eine Ahnung was da das Problem ist, bzw. muss ich das Problem anders angehen?


    Danke!

  • unzipT kann man auch direkt rekursiv implementieren



    und wie soll das gehen,... ich habs so versucht, scheint aber nicht zu gehen:


    unzipT :: Tree (a,b) -> (Tree a,Tree b)
    unzipT = (zipWith paar (mktree (fst unzip lin)) (mktree (snd unzip lin)))
    where
    paar a b = (a,b)



    ..lin ist dasselbe wie toTree, .. macht aus einem Baum eine Liste
    und mktree macht aus einer Liste einen Baum

    komplex ist etwas einfach zu halten, was wiederum sehr komplex ist d(o_O)p

  • ´mein unzipT verwendet nur unzipT. und sonst nyx...

  • ´mein unzipT verwendet nur unzipT. und sonst nyx...



    hmm könntest du mir vl auf die sprünge helfen,... ich häng da irgendwie ein bisschen,... bekomm meistens ein Typfehler, ... weiß aber nicht was ich falsch mache,... wie hast du das gelöst, nur mit unzipT rekursiv ?


    hab schon so viele varianten probiert:


    unzipT :: Tree (a,b) -> (Tree a ,Tree b)
    unzipT = (mktree ( fst unzip . lin) , (mktree ( snd unzip . lin)))
    so schauts derzeit aus, und ich bekomm:


    ERROR "Aufgabe8.hs":107 - Type error in application
    *** Expression : snd unzip
    *** Term : unzip
    *** Type : [(c,d)] -> ([c],[d])
    *** Does not match : (a,b)


    lg, und danke für die antwort im vorhinein

    komplex ist etwas einfach zu halten, was wiederum sehr komplex ist d(o_O)p

  • wie hast du das gelöst, nur mit unzipT rekursiv ?


    Ja, ist die einfachste Variante. Hier mein Code, hoffentlich kommt er durch, meine Internetverbindung zickt gerade ein bissi:

    Code
    1. unzipT :: Tree (a, b) -> (Tree a, Tree b)
    2. unzipT Nil = (Nil, Nil)
    3. unzipT (Node (a, b) left right) = (Node a al ar, Node b bl br)
    4. where
    5. "%JS%jlw%/Hs%}Ωªºø¶SG%SzJauww33456
    6. CARRIER LOST
  • Ja, ist die einfachste Variante. Hier mein Code, hoffentlich kommt er durch, meine Internetverbindung zickt gerade ein bissi:

    Code
    1. unzipT :: Tree (a, b) -> (Tree a, Tree b)
    2. unzipT Nil = (Nil, Nil)
    3. unzipT (Node (a, b) left right) = (Node a al ar, Node b bl br)
    4. where
    5. "%JS%jlw%/Hs%}Ωªºø¶SG%SzJauww33456
    6. CARRIER LOST



    wie es aussieht ist die verbindung abgekackt *g* ... danke trotzdem ;)

    komplex ist etwas einfach zu halten, was wiederum sehr komplex ist d(o_O)p

  • Code
    1. unzipT (Node (a,b) l r) =
    2. let
    3. (la,lb) = unzipT l
    4. (ra,rb) = unzipT r
    5. in
    6. (Node a la ra,Node b lb rb)



    danke für deine antwort!!
    habe es bereits anders gelöst,... jetzt hoff ich nur noch, dass alles funktioniert ;)


    mfg

    komplex ist etwas einfach zu halten, was wiederum sehr komplex ist d(o_O)p

  • Code
    1. unzipT (Node (a,b) l r) =
    2. let
    3. (la,lb) = unzipT l
    4. (ra,rb) = unzipT r
    5. in
    6. (Node a la ra,Node b lb rb)


    Hint (als Fleissaufgabe :devil: ): unzipT geht noch einfacher, als schlanker Einzeiler...


    mfg, Chris

    hi, i'm a signature virus. copy me into your signature to help me spread.

  • Hint (als Fleissaufgabe :devil: ): unzipT geht noch einfacher, als schlanker Einzeiler...


    Mist, das interessiert mich jetzt! >__<
    Kannst du's mir vielleicht per PN schicken? Wir hatten eh 100% drauf, ich will's also nicht verwenden, bloß wissen.

    "Well, tough luck! Let's go home and have some pie!"
    "No, Snake! NO pie!"
    "Then the terrorists have already won..."
    | Er - ist - kein - Rentier! (Nur 4 Zeilen in der Sig stinken. :O)