运行已编译的Haskell程序;得到错误

时间:2009-08-06 13:26:48

标签: haskell

好的,所以继my previous question之后,我最终得到了以下代码:

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'

我需要将main函数放在哪里才能使其正确编译 然后编译后,如何让它运行输出或使用命令? 我假设:

ghc chain.o +RTS -K128M

编译完成后,我只需要运行具有大堆栈大小的longestChain。

2 个答案:

答案 0 :(得分:8)

要在Haskell中编译可执行文件,您需要定义一个名为main的函数。像这样:

main = print longestChain

主模块中的任何位置。

查看ghc --make上的GHC documentation

答案 1 :(得分:2)

你的程序中的问题是maximumBy显然有一个错误。你应该向GHC人员报告:)

这是一个固定版本:

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

至于为什么它不会构建,你需要有一个'主要'功能,正如Martinho所说。也就是说,ghci只是一个GHC程序,你可以随时运行:

ghci Main.hs +RTS -K128M

当然,由于你的程序需要很长时间才能运行,所以无论如何都要编译它并不是一个坏主意。您还可以通过添加导出并从Main更改名称来编译用于GHCI的模块:

module Chain (longestChain) where

然后运行:

ghc -O2 --make Chain.hs

然后正常运行ghci:

ghci Chain.hs

如果编译对象是最新的,它将自动加载。