Ich habe versucht, das NQUEEN-Problem mit DPH zu implementieren, aber ich endete damit, dass ich den GHC.Prim.Int # -Fehler nicht vektorisieren konnte. Als ich nach dem Fehler gegoogelt habe, habe ich einen GHC Bug gefunden, der über vektorisierende Literale spricht, die für die Mustererkennung verwendet werden (http://haskell.1045720.n5.nabble.com/GHC-5702-Can-t-vectorise-pattern-matching-on -numeric-literals-td5076659.html). Ich bin mir nicht sicher, ob das der gleiche Fehler ist. Mein Code ist wie folgt,
%Vor%Bitte lassen Sie mich wissen, wenn ich etwas falsch mache. Ich benutze GHC 7.4.1.
Vielen Dank im Voraus.
Ja, das scheint mit dem Fehler zu tun zu haben, auf den Sie sich bezogen haben. Der Fehler stammt von dieser Zeile:
%Vor% Anscheinend können Sie n-Muster nicht mit -fvectorise
enabled verwenden. Lassen Sie uns diese Zeile manuell entfernen, um das n-Muster zu entfernen:
Wir haben uns jetzt mit einer kryptischen Fehlermeldung beschäftigt. Das bedeutet nicht, dass wir fertig sind, denn die nächste Fehlermeldung erscheint genauso kryptisch:
%Vor% Das Problem mit isSafe
(glaube ich) ist, dass Sie viele Datentypen und Variablen verwenden, die nicht mit -fvectorise
kompiliert wurden. Dies bedeutet, dass Sie nicht nur verknüpfte Listen ( Tycon not vectorised: []
), Prelude.fst
, Prelude.snd
oder Prelude.zip
verwenden können, es sei denn, Sie definieren diese Strukturen in Ihrem Modul neu. (Ärgerlich genug, ich kann (.)
nicht einmal verwenden, ohne es neu zu definieren.)
Wir müssen isSafe
umschreiben. Schauen wir uns die erste Zeile an:
Wir können Prelude.zip
nicht verwenden, aber wir könnten stattdessen zipP
verwenden, was bedeutet, dass wir q
nicht mehr konvertieren müssen. Unsere abnehmende Liste sollte jedoch mit DPH-Kombinatoren umgeschrieben werden. Dumm genug, enumFromThenToP
existiert nicht, also sagen wir stattdessen mapP (n I.-) (enumFromToP 0 (n I.- 1))
, um das parallele Äquivalent von [n, n I.- 1..1]
zu erhalten. Also wird diese Zeile:
Jetzt für isSafeHelper
:
Da Prelude.fst
und Prelude.snd
nicht verfügbar sind, können Sie dies beheben, indem Sie nur diese Teile des Tupels im Muster selbst extrahieren:
Aber natürlich wird es immer noch nicht kompiliert: Ihr Argument wird eine parallele Liste sein, keine verlinkte Liste im Prelude-Stil. Um dies zu umgehen, werden wir dies in einem funktionaleren Stil umschreiben, indem wir die Funktion all
:
all
funktioniert immer noch in verknüpften Listen, aber beachten Sie, dass Sie die Liste nicht manuell in Ihrer eigenen Funktion dekonstruieren. Wäre es nicht schön, wenn es für parallele Listen ein allP
gäbe? Es würde, aber es ist nicht. Es ist jedoch nicht schwer, es zu schreiben:
Wenn Sie alles zusammenfügen, können Sie isSafe
wie folgt schreiben:
nqueens_wrapper
scheint in Ordnung zu sein. Dein Code sollte jetzt kompilieren.
Einige Anmerkungen:
*** Exception: crossMapP: not implemented
und weiß nicht, wie ich es beheben kann), aber es sieht so aus. isSafe
funktioniert andersherum nicht. Wenn Sie versuchen, mit Prelude
numbers in Prelude
lists zu arbeiten, erhalten Sie die Beschwerde über Int#
erneut. Ich denke, das liegt daran, dass isSafe
von mindestens einer vektorisierten Funktion nqueens
verwendet wird. Geben Sie Data.Array.Parallel.Prelude
nicht ein. Die Modulbeschreibung sagt so:
Dieses Modul sollte nicht mehr explizit in Benutzercode importiert werden. Der Benutzercode sollte nur die parallelen und, bis der Vektorisierer Typklassen unterstützt, die typspezifischen Module importieren.
Verrück dich nicht mit lokalen Definitionen. isSafeHelper
fehlt das Argument n
in Ihrer Version.
Tags und Links haskell data-parallel-haskell