我从文件中读取时遇到问题。每当我需要从文件中读取时,我都会这样做:
main = do x <- readFile "/tmp/foo.txt"
putStr x
但是现在我希望这条道路成为一个论点,所以我尝试了下面的
main s = do x <- readFile s
putStr x
它不起作用。我看到以下错误:
Couldn't match expected type `IO t0'
with actual type `FilePath -> IO ()'
In the expression: main
When checking the type of the function `main'
我的作业是编写一个程序,程序必须包含一个main函数(因为它将被编译),而call的参数必须包含文件的名称。我不确定我是否理解这一点,我不知道如何继续。我会感激一些帮助。
答案 0 :(得分:17)
main
IO t
函数始终具有类型t
,(对于某些类型System.Environment
将被忽略)因此永远不会接受正常的函数参数,所以这不是正确的方法。
您正在寻找函数Haskell report specifies(您必须为其导入模块String
。它会将传递给您的程序的参数作为import System.Environment
main = do
args <- getArgs
case args of
[file] -> do
x <- readFile file
putStr x
_ -> putStrLn "Wrong number of arguments"
的列表返回。
所以你的代码看起来像是:
{{1}}
答案 1 :(得分:9)
在Haskell中,由于Haskell绑定其启动方式并保持一致,因此不会向main函数赋予参数。您需要使用System.Environment.getArgs
。
特别是,因为Haskell是纯函数式语言,main
是一个monadic动作,用于组织由软件执行的副作用 - 计算 - 由main
计算的结果被丢弃,因为在函数式语言中,你与环境分离计算并且只与它作为副作用相互作用。
import System.Environment
main = do x <- getArgs; print x
这将打印出您在命令行上输入的内容。