3

たとえば、StackOverflowの質問に答えてDonStewartが書いたコードを見てみましょう。

import Control.Monad
import qualified Data.HashTable as H
import System.Environment

main = do
  [size] <- fmap (fmap read) getArgs
  m <- H.new (==) H.hashInt
  forM_ [1..size] $ \n -> H.insert m n n
  v <- H.lookup m 100
  print v

GHCiにロードします。

:t getArgs ---> getArgs :: IO [String]
:t main    ---> main :: IO ()

mainの型アノテーションが呼び出されているという事実を反映していないのはなぜgetArgs :: IO [String]ですか?

バイナリを実行すると、引数を指定できます。 しかし、GHCiでは、次のことはできません。エラーが発生し<prog> 145ます。このプログラムをGHCiでどのように実行し、議論をしますか。Just 100main 145

4

2 に答える 2

6

の型mainは、その最終式の型です。printを生成するIO ()ので、それは のタイプですmain(>>=)モナド以外のものを伝播しないため、中間型は関係ありません。

(>>=) :: Monad m => m a -> (a -> m b) -> m b

a結果タイプ ( ) には表示されませんm b

GHCi でプログラムを実行する場合は、:mainコマンドを見てください。

于 2011-06-18T15:20:03.420 に答える
4

:setargs の値が必要です。例えば:

Prelude> import System.Environment
Prelude System.Environment> getArgs
[]
Prelude System.Environment> :set args ["foo","bar"]
Prelude System.Envrionment> getArgs
["foo","bar"]

型シグネチャの問題に関しては、ここでの main の型は によって決定されprint vます。それより前の他のすべては、>>演算子を介して無視されます。

于 2011-06-18T15:30:17.890 に答える