Warum ist mein Hash-Programm so langsam? Programmierung in Haskell, Spiel des Lebens

Ich gehe durch das Buch "Programming in Haskell" (zweite Ausgabe) und habe festgestellt, dass das Beispiel "game of life" nach einigen Iterationen extrem langsam wird (es scheint, als würde es mit jeder Iteration exponentiell langsamer). Ich habe ein Profil erstellt, kann aber nichts Verdächtiges im sehen prof Datei.

Wahrscheinlich fehlt mir etwas offensichtliches. Können Sie mir helfen, herauszufinden, was es ist?

Hier ist mein Code:

importieren Sie System.IO

main = do
    hSetBuffering stdout NoBuffering
    Lebensflugzeug

Typ Position = (Int, Int)

Typ Board = [Position]

width :: Int
Breite = 10

Höhe :: Int
Höhe = 10

Segelflugzeug :: Board
Segelflugzeug = [(4,2),(2,3),(4,3),(3,4),(4,4)]

clear :: IO ()
clear = putStr " ESC[2J "

writeAt :: Position -> String -> IO ()
writeAt position text = do
    gehe zur Position
    putStr-Text

gehe zu :: Position -> IO ()
goto (x, y) = putStr (" ESC["++ (show y) ++"; "++ (show x) ++" H ")

showCells :: Board -> IO ()
showCells board = sequence_[writeAtsinglePosition"0"|singlePosition[writeAtsinglePosition"0"|singlePosition<- board]

isAlive :: Board -> Position -> Bool
isAlive Board Position = Elem Position Board

isEmpty :: Board -> Position -> Bool
isEmpty board position = nicht (isAlive board position)

Nachbarn :: Position -> [Position]
Nachbarn (x, y) = 
    [(x - 1, y - 1),
    (x, y - 1),
    (x + 1, y - 1),
    (x - 1, y),
    (x + 1, y),
    (x - 1, y + 1),
    (x, y + 1),
    (x + 1, y + 1)]

wrap :: Position -> Position
Umbruch (x, y) =
    (((x - 1) `mod` width) + 1,
    ((y - 1) `mod` height) + 1)

numberOfLiveNeighbors :: Board -> Position -> Int
numberOfLiveNeighbors board = Länge. filter (isAlive-Karte). Nachbarn

Überlebende :: Vorstand -> [Position]
Hinterbliebenenbrett =[singlePosition |
    singlePosition <- board,
    elem (numberOfLiveNeighbors board singlePosition) [2, 3]]

births :: Board -> [Position]

Geburtenbrett =[singlePosition |
    singlePosition <- removeDuplicates (concat (map neighbors board)),
    isEmpty board singlePosition,
    numberOfLiveNeighbors board singlePosition == 3]

removeDuplicates :: Eq a => [a]  -> [a]
Duplikate entfernen [] = []
removeDuplicates (x: xs) = x: Filter (/ = x) xs

nextGeneration :: Board -> Board
nextGeneration board = (Hinterbliebenenbrett) ++ (Geburtenbrett)

Leben :: Board -> IO ()
Life Board = tun
    klar
    showCells-Board
    _ <- getChar
    Leben (nextGeneration Board)

Und hier ist der prof Datei:

        Mo Apr 29 08:57 2019 Bericht über Zeit- und Zuweisungsprofile (Finale)

       Main.exe + RTS -p-RTS

    Gesamtzeit = 0,00 Sekunden (0 Ticks @ 1000 us, 1 Prozessor)
    Gesamtzuweisung = 83.504 Byte (ausgenommen Profilierungsaufwand)

COST CENTER MODULE SRC% time% zuteilen

writeAt Main Main.hs: (30,1) - (32,15) 0,0 6,3
showCells Main Main.hs: 38: 1-82 0.0 1.8
life Main Main.hs: (86,1) - (90,31) 0,0 2.3
gehe zu Main Main.hs: 35: 1-68 0.0 11.2
klar Main Main.hs: 27: 1-24 0.0 12.5
CAF GHC.IO.Exception            0,0 2,3
CAF GHC.IO.Handle.FD            0,0 62,4


                                                                                 einzeln vererbt
KOSTENZENTRUMMODUL SRC-Nr. Einträge% Zeit% Zuteilung% Zeit% Zuteilung

HAUPT HAUPT                                  109 0 0,0 0,8 0,0 100,0
 CAF GHC.TopHandler                   165 0 0,0 0,1 0,0 0,1
 CAF GHC.IO.Handle.FD                 145 0 0,0 62,4 0,0 62,4
 CAF GHC.IO.Exception                 143 0 0,0 2,3 0,0 2,3
 CAF GHC.IO.Encoding.CodePage         136 0 0,0 0,2 0,0 0,2
 CAF GHC.IO.Encoding                  135 0 0,0 0,1 0,0 0,1
 CAF Main                             116 0 0,0 0,1 0,0 8,9
  clear Main Main.hs: 27: 1-24 220 1 0,0 0,4 0,0 0,4
  Segelflugzeug Main Main.hs: 24: 1-40 226 1 0,0 0,0 0,0 0,0
  main Main main.hs: (9,1) - (11,15) 218 ​​1 0,0 0,1 0,0 8,4
   Hauptlebensdauer: (86,1) - (90,31) 222 1 0,0 0,2 0,0 8,3
    showCells Main Main.hs: 38: 1-82 225 1 0,0 1,8 0,0 8,1
     writeAt Main Main.hs: (30,1) - (32,15) 228 5 0,0 0,7 0,0 6,3
      goto Main Main.hs: 35: 1-68 230 5 0,0 5,6 0,0 5,6
 main Main main.hs: (9,1) - (11,15) 219 0 0,0 0,0 0,0 25,2
  clear Main Main.hs: 27: 1-24 221 0 0,0 11,0 0,0 11,0
  Hauptlebensdauer: (86,1) - (90,31) 223 0 0,0 2,0 0,0 14,2
   clear Main Main.hs: 27: 1-24 224 0 0,0 1,1 0,0 1,1
   showCells Main Main.hs: 38: 1-82 227 0 0,0 0,0 0,0 11,1
    schreiben Sie Main Main.hs: (30,1) - (32,15) 229 0 0,0 5,6 0,0 11,1
     goto Main Main.hs: 35: 1-68 231 0 0,0 5,6 0,0 5,6

8 – Warum wird in meiner Seitenansicht ein Fehler von 500 im Browser angezeigt?

Ich habe eine Ansicht erstellt, um die Benutzerseite zu ersetzen.

Wenn ein Benutzer das Konto eines anderen Benutzers besucht, weist er einen Fehler 403 auf.

Hier ist seine Konfiguration:

Geben Sie hier die Bildbeschreibung ein

Geben Sie hier die Bildbeschreibung ein

Wenn ich zum Konto des aktuellen Benutzers gehe, funktioniert es. Wenn ich zum Konto eines anderen Benutzers gehe, habe ich einen Fehler von 500 in meinem Browser:

HTTP ERROR 500

In den Drupal-Protokollen habe ich viele Fehler, aber keine Details:

Geben Sie hier die Bildbeschreibung ein

In den Apache-Protokollen habe ich den folgenden Fehler:

[Sun Nov 18 13:02:17.467832 2018] [proxy_fcgi:error] [pid 17384:tid 140440486577920] [client 185.228.231.100:63896]  AH01071: Fehler 'PHP-Nachricht: Schwerwiegender PHP-Fehler: Zulässige Speichergröße von 134217728 Byte erschöpft (versucht, 20480 Byte zuzuordnen) in / var / www / www-domaine-com / web / core / modules / views / src / Plugin / views / display / PathPluginBase.php in Zeile 397  n '

Ich verstehe nicht, warum die Seite nicht funktioniert. Wie kann ich das beheben?