好的,所以继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。
答案 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
如果编译对象是最新的,它将自动加载。