Ich arbeite den Code aus this Papier aus. Es nervt mich, dass meine Übersetzung ausführlicher ist. Es fällt mir auf, dass ich etwas Offensichtliches vermisse, das es so prägnant machen würde wie das Original Miranda.Miranda To Haskell - Was ist die verbesserte Version?
Hier ist der Miranda:
fix :: qtree(*) -> qtree(*)
fix(Leaf(x)) = Leaf(x)
fix(Internal(nw, ne, sw, se)) =
merge(Internal(fix(nw), fix(ne), fix(sw), fix(se)))
where
merge(Internal (Leaf(x), Leaf(x), Leaf(x), Leaf(x))) = Leaf(x)
merge(other) = other
Beachten Sie die linke Seite von merge
. Es erfasst den Fall, in dem alle vier Blätter den gleichen Wert haben. Ich kann keine direkte Transliteration in Haskell machen, denn ich werde mehrere Definitionen von x
beanstanden. Hier ist meine Version:
fix :: (Eq a) => QTree a -> QTree a
fix (Leaf a) = Leaf a
fix (Internal nw ne sw se) =
merge (Internal (fix nw) (fix ne) (fix sw) (fix se))
where
merge [email protected](Internal (Leaf w) (Leaf x) (Leaf y) (Leaf z))
| (w == x) && (x == y) && (y == z) = Leaf x
| otherwise = internal
merge other = other
Wie kann ich näher an, was in dem Miranda-Code ist hier los?
Ich denke, man könnte 'schreiben allEq [] = True; allEq (x: xs) = alle (x ==) xs', die dir vielleicht ein wenig helfen könnten. Letztendlich sind nicht-lineare Muster nicht in Haskell und sie sind in Miranda, so scheint es, also wirst du etwas mehr Arbeit machen müssen, um das auszugleichen. Übrigens können Sie die '| ansonsten Zeile, die nächste Gleichung wird sich darum kümmern. – luqui
Danke. Ich gebe immer ein anderes als Reflex an. Guter Fang. –