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.
War es hilfreich?

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. Die Ord a war überflüssig, und nur gemeint, dass bestimmte Arten von Elementen nicht anerkannt wurden.
  • Die Muster [x, _] <- list1 bedeutet, dass jedes Element list1 eine Zwei-Element-Liste sein muss. Verwenden x <- 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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top