Was ist falsch mit meiner Definition von Zip in Haskell?
-
23-09-2019 - |
Frage
-- eg. myzip [’a’, ’b’, ’c’] [1, 2, 3, 4] -> [(’a’, 1), (’b’, 2), (’c’, 3)]
myzip :: Ord a => [a] -> [a] -> [(a,a)]
myzip list1 list2 = [(x,y) | [x, _] <-list1, [y,_] <-list2 ]
ich diese Fehlermeldung:
Occurs check: cannot construct the infinite type: a = [a]
When generalising the type(s) for `myzip'
Failed, modules loaded: none.
Lösung
Es gibt drei Probleme: Eines der Muster Spiel ist, ist eine der Typ Unterschrift, und man ist die Art der Liste Verständnis. Hier ist eine korrigierte Version:
{-# LANGUAGE ParallelListComp #-}
myzip :: [a] -> [b] -> [(a, b)]
myzip xs ys = [(x, y) | x <- xs | y <- ys]
- Die ursprüngliche Art Unterschrift,
[a] -> [a] -> [(a, a)]
, bedeutete, dass beide Listen die gleiche Art von Element haben. DieOrd a
war überflüssig, und nur gemeint, dass bestimmte Arten von Elementen nicht anerkannt wurden. - Die Muster
[x, _] <- list1
bedeutet, dass jedes Elementlist1
eine Zwei-Element-Liste sein muss. Verwendenx <- list1
statt. - Die beiden Listenkomprehensionen sind in Reihe statt parallel. Denken Sie an das Komma als „Nimm Elemente aus list1, dann von list2“ (Serie). Denken Sie an den beiden Rohren als parallel zu sein.
Der Unterschied zwischen Reihen- und Parallel:
> [[x, y] | x <- "abc", y <- "123"] -- series
["a1","a2","a3","b1","b2","b3","c1","c2","c3"]
> [[x, y] | x <- "abc" | y <- "123"] -- parallel
["a1","b2","c3"]
Andere Tipps
Wenn Sie zip
zu gewinnen, um einen Einblick in Haskell erneut zu schreiben, würde ich vorschlagen, dass Sie versuchen, es zu schreiben, ohne Listenkomprehensionen zu verwenden. Listenkomprehensionen sind mächtig, aber sind ein wenig wie eine bequeme Abkürzung für einige bestimmte Fälle in Haskell. Und wie Sie sehen, sie in anderen Fällen zu verwenden, erfordert möglicherweise Nicht-Standard-Erweiterungen (wie ParallelListComp
).
Denken Sie darüber nach, was zip
braucht im allgemeinen Fall zu tun, und was passiert, wenn der allgemeine Fall nicht erfüllt ist (was auf zwei Arten geschehen kann!). Die Gleichungen für die Funktion sollen natürlich aus, dass fallen.