2011-12-28 11 views
2

おはようございますプログラマー!ハスケルコール関数onload

にのみ行うことができます私はHaskellのを使用してプロジェクトに取り組んでいる、と私はGHCiの上の2つの行を入力することなく、Haskellの関数を実行する方法を知っていたいと思っていた、例えば

ghci filename.hs function 

する:

ghci filename.hs 
function 

???? 私はC言語のmain()のようなものを探していますが、プログラムをコンパイルすると自動的に実行されます。 そんなことはありますか? 私はghciで-eオプションをチェックしてきましたが、うまく動作しないようです!

ありがとうございました!

乾杯!

答えて

6

functionIO()とします。次に、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'オプションを非常に使いやすくすることができますコマンドラインで関数にargを渡します。 –

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と入力してもう一度テストしてください。あなたは本当のプログラムを構築するために探しての代わりに、迅速 をテストしている場合は

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

:これはあまりにも退屈と思われる場合も、あなたも、あなたがリロードすると同時にあなたの機能をテストすることができGHCiのマクロを定義することができますあなたの関数は、 main関数を書いて他の答えを読む方が良いでしょう。

+0

+1 ghciのコマンドライン*および* ':def'から' ghc -e'を使用する例?ニース! –