Haskell: Почему GHC для основного метода не совсем завершил тип? - PullRequest
3 голосов
/ 18 июня 2011

Например, возьмите код, написанный Доном Стюартом в ответ на какой-то вопрос переполнения стека:

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] вызывается?

Когда вы запускаете двоичный файл, вы можете указать аргумент.<prog> 145 возвращает Just 100 Но в GHCi вы не можете: main 145 выдает ошибку.Как вы запускаете эту программу в GHCi и приводите аргумент.

Ответы [ 2 ]

6 голосов
/ 18 июня 2011

Тип main - это тип его окончательного выражения; print производит IO (), так что это тип main. Промежуточные типы не имеют значения, так как (>>=) не распространяет ничего, кроме монады.

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

a не отображается в типе результата (m b).

Что касается запуска вашей программы в GHCi, взгляните на команду :main.

4 голосов
/ 18 июня 2011

Вы хотите :set значение аргументов.Например:

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

Что касается проблемы с сигнатурой типа, тип main здесь определяется как print v.Все остальное до того, как оно игнорируется оператором >>.

...