2016-09-05 15 views
0

に私は、コマンドライン上でうまく動作し、次のコードを持っていない:はなぜHaskellでは私のコードは、コマンドライン上で動作んが、ファイル

ghci> [let square x = x * x in (square 5, square 3, square 2)] 
[(25,9,4)] 

をしかし、私は、ファイルにそれを持って、それをコンパイルしたときに、それ

[1 of 1] Compiling Main    (baby.hs, interpreted) 

baby.hs:62:1: 
    Parse error: naked expression at top level 
    Perhaps you intended to use TemplateHaskell 
Failed, modules loaded: none. 

答えて

6

REPL、GHCiはHaskell式を受け入れます。 Pythonとは異なり、Haskellモジュールは宣言で構成されていなければなりません。

たとえば、式は1+1でも可能ですが、ソースファイルのトップレベルとしては意味をなさない人間の観点からも、宣言された変数はなく、操作は実行されません。あなたは同じですが、letで行うことができます

val = [let square x = x * x in (square 5, square 3, square 2)] 

またはREPLに:トップレベルで、あなたのような、値を宣言することができます(つまり、ファイルをソース)

let val = [let square x = x * x in (square 5, square 3, square 2)] 
3

Haskellのモジュールを、通常はsome_var = expressionという形式の宣言が含まれています。この行は式(lazilly)を評価し、変数some_varにそれを(バインドして)割り当てます。式だけを置くだけでは( "裸の式")、コンパイラはそれをどうしたらいいのか分かりません。だからあなたはそれを変数にバインドするか、他の何かを行う必要があります。だから、例えば、以下がcomplileます:

sumSqaures = [let square x = x * x in (square 5, square 3, square 2)] 

は今、これは非常に便利なモジュールではない、とあなたが実行可能(とないライブラリ)としてコンパイルしようとした場合、実際には、それは失敗します。これは、実行ファイルが mainという変数を定義することになっているためです。あなたがコンパイルされ、完全なプログラムをしたいのであれば、あなたはこの

main = print sumSqaures 

sumSqaures = [let square x = x * x in (square 5, square 3, square 2)] 

あるいは単にライン

main = print [let square x = x * x in (square 5, square 3, square 2)] 
を試すことができます
関連する問題