2009-08-06 10 views
4

Ok bekommen, so von my previous question folgenden auf I mit dem folgenden Code am Ende habe:Ausführen eines kompilierten Haskell-Programms; Fehler

module Main where 

import Data.List 

chain n | n == 0  = error "What are you on about?" 
     | n == 1  = [1] 
     | rem n 2 == 0 = n : chain (n `div` 2) 
     | otherwise = n : chain (3 * n + 1) 


chainLength n = (n,length (chain n)) 
array = map chainLength [1..999] 
lengths = map chainLength [1..1000000] 

compareSnd (_, y1) (_, y2) = compare y1 y2 
longestChain = maximumBy compareSnd lengths 

Vom GHCi diese lädt als Modul in Ordnung, aber laufen longestChain endet mit einem Stapelüberlauf auf. Die Lösung für dieses Problem, das kein vollständiges Neuschreiben ist, besteht darin, die Stapelgröße zu erhöhen. So kompilieren ich mit: ghc --make chain.hs

Ich erhalte eine Fehlermeldung:

chain.hs:1:0: The function 'main' is not defined in the module 'main' 

Wo ich die Hauptfunktion in platzieren tun müssen, richtig machen es kompilieren.
Dann einmal kompiliert, wie mache ich es die Ausgabe ausführen oder den Befehl verwenden? Ich gehe davon mit:

ghc chain.o +RTS -K128M 

Einmal zusammengestellt, ich brauche es nur mit einer großen Stack-Größe zu laufen longestChain.

Antwort

8

Um eine ausführbare Datei in Haskell Sie eine Funktion main genannt definieren müssen kompilieren. Etwas wie dieses:

main = print longestChain 

irgendwo im Hauptmodul.

Überprüfen Sie die GHC documentation auf ghc --make aus.

+0

Danke, du bist ein Lebensretter. Meine Fähigkeiten in Haskell haben sich dank Ihrer Hilfe stark verbessert. –

+3

Übrigens, ich habe bemerkt, dass Sie immer noch Arrays für diese [] Dinge aufrufen. Es gibt Arrays in GHC, aber sie sind nicht identisch mit * lists *. Es hilft, korrekte Terminologie zu verwenden. Wenn Sie die Unterschiede lernen möchten: http://www.cs.auckland.ac.nz/references/haskell/haskell-intro-html/arrays.html und http://www.haskell.org/tutorial/goodies .html –

+1

Ruf mich an, wenn du zu den "bösen" Monaden kommst ;-) –

2

Das Problem in Ihrem Programm ist, dass maximumBy offenbar einen Fehler in ihm hat. Sie sollten dies den GHC Leute berichten :)

Hier ist eine feste Version:

maximumByFixed :: (Ord a) => (a -> a -> Ordering) -> [a] -> a 
maximumByFixed op (h:t) = step h t 
    where 
     step v [] = v 
     step v (h:t) 
      | v `op` h == LT 
      = step h t 
      | otherwise 
      = step v t 

Was, warum es nicht bauen, müssen Sie eine ‚Haupt‘ Funktion haben, wie Martinho sagt. Das heißt, GHCI ist nur ein GHC-Programm können Sie immer laufen:

ghci Main.hs +RTS -K128M 

Natürlich, da Ihr Programm dauert eine ganze Weile zu laufen, ist es keine schlechte Idee, es trotzdem zu kompilieren.

module Chain (longestChain) where 

Dann laufen:

ghc -O2 --make Chain.hs 

und führen GHCi als normal:

ghci Chain.hs 
Sie können auch durch Zugabe von Exporten und die Änderung des Namens von der Main ein Modul für die Verwendung mit GHCI kompilieren

Dies lädt das kompilierte Objekt automatisch, wenn es aktuell ist.

+0

Ein kleiner (aber wichtiger!) Fehler wurde behoben, oops. – bdonlan

+1

@bdonlan: Es besteht keine Notwendigkeit für "Ord a" im Kontext von maximumBy, da nur "a" s mit der mitgelieferten Vergleichsfunktion verglichen werden soll. – yairchu

Verwandte Themen