6

私はghcで非常に小さなhaskellコードをコンパイルしようとしています:

module Comma where

import System.IO

main = do  
    contents <- getContents  
    putStr (comma contents)  

comma input = 
  let allLines = lines input
      addcomma [x]    =   x
      addcomma (x:xs)   = x ++ "," ++ (addcomma xs)
      result = addcomma allLines
  in result

コンパイルに使用しているコマンドは次のとおりです。

ghc --make Comma.hs

そして、私はこの答えを得ています:

[1/1] Comma のコンパイル ( Comma.hs、Comma.o )

ファイルは生成されず、警告やエラー メッセージも表示されません。

コードから「module Comma where」行にコメントを付けると、正しくコンパイルされます。

[1/1] Main ( Comma.hs, Comma.o ) のコンパイル Comma のリンク ...

何が起こっているのかわかりません。私はghc 7,4,1(Glasgow Haskell Compiler、バージョン7.4.1、GHCバージョン7.4.1で起動されるステージ2)とubuntu linuxを使用しています。

モジュール定義でコンパイルされない理由を誰かに教えていただければ幸いです

4

3 に答える 3

10

GHC は関数Main.mainを実行可能ファイルのエントリ ポイントとしてコンパイルします。モジュール宣言を省略すると、Module Main where暗黙的に挿入されます。

しかし、明示的に ghc 以外の名前を付けるとMain、エントリ ポイントが見つかりません。

私の通常のワークフローはghci、これらのスニペットの代わりに (または ghci + emacs) を使用することです。これにより、この問題を完全に回避できます。または、 でコンパイルし-main-is Commaて、明示的に ghc に Comma モジュールを使用するように指示することもできます。

于 2013-07-26T18:16:33.950 に答える
5

ファイルは生成されません

本気ですか?少なくともComma.oComma.hiが生成されることを期待します。前者には、実行可能ファイルにリンクする準備が整ったコンパイル済みコードが含まれており、後者には、モジュールをインポートするモジュールを型チェックするために ghc が使用するインターフェース情報が含まれていますComma

ただし、メイン関数がある場合、ghc はコンパイルされたモジュールを実行可能ファイルにリンクするだけです。デフォルトでは、これは という名前mainのモジュールで名前が付けられた関数を意味しますMain。明示的なモジュール名を指定しない場合、名前Mainが想定されます。そのため、module Comma where行を削除するとテストが機能します。

ファイルをコンパイルしてリンクするには、の代わりに使用するか、フラグを使用して ghc がメイン関数であることを伝えます。Comma.hsmodule Main wheremodule Comma where-main-isComma.main

ghc --make -main-is Comma Comma.hs

または:

ghc --make -main-is Comma.main Comma.hs
于 2013-07-26T20:51:33.840 に答える
1

ファイルにmain定義があり、それを実行可能ファイルにコンパイルしたい場合は、module Main where.

于 2013-07-26T18:15:17.570 に答える