2009-08-06 4 views
4

を取得し、私は次のコードになってしまっているmy previous questionから続く:コンパイル済みのHaskellプログラムを実行しています。 [OK]をエラー

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 

GHCiのから、これはモジュールとして罰金ロードしますが、longestChainを実行すると、スタックオーバーフローで終わります。完全な書き換えではないこの問題に対する解決策は、スタックサイズを増やすことです。 だから私は使用してコンパイル: GHC --make chain.hs

私はエラーを取得する:

私はそれを正しくコンパイルするためにの主な機能を配置する必要があります
chain.hs:1:0: The function 'main' is not defined in the module 'main' 


一度コンパイルしたら、出力を実行させる方法とコマンドを使用する方法はありますか? 私が想定しています

一度コンパイル
ghc chain.o +RTS -K128M 

、私はそれが大きなスタックサイズとlongestChainを実行する必要があります。

答えて

8

Haskellで実行可能ファイルをコンパイルするには、mainという関数を定義する必要があります。次のようなものがあります。

main = print longestChain 

メインモジュールのどこにでもあります。

GHC documentationghc --makeで確認してください。

+0

ありがとうございます、あなたは命の恩人です。ハスケルの私のスキルは助けてくれてとても感謝しています。 –

+3

ところで、私はあなたがまだそれらの物に配列を呼んでいることに気づいた。 GHCには配列がありますが、* lists *と同じではありません。正しい用語を使用することができます。違いを知りたい場合:http://www.cs.auckland.ac.nz/references/haskell/haskell-intro-html/arrays.htmlおよびhttp://www.haskell.org/tutorial/goodies .html –

+1

"悪い"モナドになったら電話してください;-) –

2

プログラムの問題は、maximumByに明らかにバグがあることです。マルティーニが言うように、それは、あなたが「メイン」機能を持っている必要があり、構築しない理由については

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 

:あなたはGHCの人々にこれを報告しなければならない:)

をここに固定されたバージョンです。いえ、GHCiの年代だけでGHCプログラムは、いつでも実行することができます。もちろん

ghci Main.hs +RTS -K128M 

、あなたのプログラムの実行にかなり時間がかかるので、それはとにかくそれをコンパイルする悪い考えではないのです。また、輸出を追加し、メインから名前を変更することにより、GHCiのに使用するためのモジュールをコンパイルすることができます。

module Chain (longestChain) where 

次に実行します。

ghc -O2 --make Chain.hs 
を、その後、通常通りGHCiの実行:

ghci Chain.hs 

これは、最新のものであれば、コンパイルされたオブジェクトを自動的にロードします。

+0

小さな(しかし重要な!)エラーが修正されました。 – bdonlan

+1

@bdonlan:与えられた比較関数を使って "a"だけを比較する必要があるので、maximumByのコンテキストで "Ord a"の必要はありません。 – yairchu