Этот не только вычисляет n!, это также O (n!). Это может иметь проблемы, если Вы хотите вычислить что-либо "большое" все же.
long f(long n)
{
long r=1;
for (long i=1; i<n; i++)
r=r*i;
return r;
}
long factorial(long n)
{
// iterative implementation should be efficient
long result;
for (long i=0; i<f(n); i++)
result=result+1;
return result;
}
Это будет проще, если вы переделаете свой main
, чтобы он открывался сам файл.
import System.Environment
import System.IO
main :: IO ()
main = do
args <- getArgs
case args of
[] -> doStuff stdin
file:_ ->
withFile file ReadMode doStuff
doStuff :: Handle -> IO ()
doStuff = …
*Main> System.Environment.withArgs ["main.txt"] main
Не используйте EOF для стандартного ввода, находясь внутри GHCi. Если вы это сделаете, все дальнейшие попытки чтения из stdin потерпят неудачу:
Prelude> getLine *** Exception: <stdin>: hGetLine: illegal operation (handle is closed) Prelude> getContents *** Exception: <stdin>: hGetContents: illegal operation (handle is closed)
Вы МОЖЕТЕ ввести: main в GHCi для вызова параметров командной строки. Боюсь, вы, вероятно, просто захотите этим воспользоваться.