2017-12-09 9 views
-1

私の目標は、ghciのいくつかのステップをパイプしてbashスクリプトから実行し、正常に終了することです。解説オンラインsaysにはrunhaskellを使用してください。なぜghciはrunHaskellと異なった動作をしますか?

これは私が実行しようとしているcommandです:私が得る

(-3633736515773289454,693699796 2103410263) 

私はファイルrandomtest.hsにこれをドロップすると、runhaskellでそれを実行すると:

ghci> import System.Random 

ghci> random (mkStdGen 100) :: (Int, StdGen) 

に似期待される結果と次のエラー:

randomtest.hs:3:1: error: 
    Invalid type signature: random (mkStdGen 100) :: ... 
    Should be of form <variable> :: <type> 

正しい方向に進むにはヒントが必要です。

私の質問は:なぜghciはrunHaskellとは異なった動作をしますか?

+0

GHCiはコードの動作をチェックするためのツールです。 GHCiはHaskellプログラムを実行する方法ではなく、そのように扱われるべきではありません。 – AJFarmar

+0

実行時に、コマンドを手動で入力した場合(プロンプト、入力、出力をすべて表示している場合)、GHCiセッションのようなライブ転写を生成するスクリプトを作成する方法が欲しいということですか? ? –

+0

ありがとうございます@ K.A.Buhr - 私は、この問題をより重視するために、この問題を別の質問に押しました。 – hawkeye

答えて

2

ghciはREPL(読み取り、評価、印刷ループ)です。しかし、runhaskellは、プログラムを実行可能ファイルにコンパイルして実行するのとほぼ同じです。 GHCIでは、個々の関数と任意の式を実行できますが、runhaskellはmain関数を呼び出してファイルをコンパイルするのではなく、解釈して実行します。

@AJFarmarは、ビルドしているプログラムをデバッグしてテストするのに最適ですが、runhaskellはコンパイルせずにプログラム全体を実行するのに最適です。

問題を解決するには、プログラムに主な機能を与えるだけです。 ghciは、インタープリターに入力され、変数にバインドされていないすべての式の結果についてprintを呼び出します。

だから、私たちの主な機能は、ちょうどすることができます:

main = print (random (mkStdGen 100) :: (Int, StdGen))

我々はまだSystem.Randomをインポートする必要があるので、ファイル全体は次のようになります。

import System.Random 

main = print (random (mkStdGen 100) :: (Int, StdGen)) 

予想通りその後、我々は実行することができます。

[~]λ runhaskell randomtest.hs 
(-3633736515773289454,693699796 2103410263) 

複数のコマンドrunhaskellからは、メインブロックのdoブロックを追加するだけです。

import System.Random 

main = do 
    print (random (mkStdGen 100) :: (Int, StdGen)) 
    let x = 5 * 5 
    print x 
    putStrLn "Hello world!" 
+0

クール - ghciをスクリプト化してbashスクリプトから実行して正常に終了する方法はありますか? – hawkeye

+0

@ hawkeyeあなたが達成しようとしていることを正確には分かりません。 Ghciはスクリプティングにはあまり適していません。 – Zpalmtree

+0

シバンで 'runhaskell'を使うことができます。例が助けてくれますか? –

関連する問題