2011-12-28 88 views
2

早上好夥計程序員!Haskell調用函數onload

我在一個項目使用哈斯克爾,我也想知道如何不必鍵入ghci的兩條線運行Haskell的功能,例如

ghci filename.hs function 

這隻能做這樣做的:

ghci filename.hs 
function 

???? 我正在尋找類似於C中main()的東西,它在編譯程序時自動運行 有沒有類似的東西? 我一直在檢查-h選項上的ghci,但我似乎無法得到它的工作!

非常感謝!

乾杯!

回答

6

我假設function的類型爲IO()。然後您可以讓main = function,並從命令行使用例如runhaskell modulename。和C一樣,main是一個特殊功能。

澄清一點,以防萬一:如果您的function是純粹的,即其類型不包含IO,您不能真正「運行它」。我想這是一個簡單的說法,但基本上GHCi所做的就是致電print function。如果你想模仿這一點,你可以使用像main = print function和使用runhaskell。這假定function的類型是Show的一個實例。

+0

最近發佈的[ReadArgs](http://www.reddit.com/r/haskell/comments/nsxwz/readargs10_now_on_hackage/)庫可以讓'main' +'runhaskell'選項相當不錯,如果你想在命令行中將參數傳遞給函數。 – 2011-12-28 20:57:42

8

你可能尋找ghc -e代替:

> echo 'foo x y z = x+y*z' > foo.hs % let's make a foo.hs file 
> ghc foo.hs -e 'foo 1 2 3'   % call the function in foo.hs 
=> 7 

另外請注意,您還可以在ghci中使用:reload命令。在ghci中加載文件,編輯,輸入:reload並再次測試。此外,如果這似乎太單調乏味,你也可以定義一個宏ghci中,它允許你重新加載,並在同一時間測試功能:

> :def test \x -> return (":reload\n" ++ x) 
> :test foo 1 2 3 
=> Ok, modules loaded: Foo. 
7 

如果你希望建立真正的程序,而不是快速測試 你的功能,那麼你最好在編寫 main函數時閱讀其他答案。

+0

+1在ghci中從命令行*和*':def'使用'ghc -e'的例子?太好了! – 2011-12-28 20:55:08