2012-10-09 62 views
2

我试图从文件中获取一些数据,然后解析它并将它作为参数传递给另一个函数。Haskell - 读取文件并将数据作为参数传递给函数

data LogLine = LogLine { 
    name  :: String 
, args1  :: String 
, args2  :: String 
, constant :: String 
} deriving (Ord, Show, Eq) 

main = do 
file <- readFile "foo" 
let result = (parse final "Input" file) --Parses the file into the LogLine datatype 
let firstargs = getFirstArgs result --Get the first argument out of the datatype 
let secondargs = getSecondArgs result --Get the second argument out of the datatype 
let constant = getConstant result --Get the constant out of the datatype 
createGraph firstargs secondargs constant --THIS IS THE PROBLEM 

的问题是,每当我试图读取一个文件就变成一个(IO字符串),我总是携带IO无论我做什么。 的createGraph函数声明为

createGraph :: String -> String -> String -> Argument 

但每当我试图执行的最后一条语句,报告说:

Couldn't match expected type `IO a0' with actual type `Argument' 
In the return type of a call of `createGraph' 

我不能改变createGraph函数的返回类型,因为它是这是我需要提供参数的一个大框架的一部分。 处理这个问题的方法是什么?

+0

东西是不是你的代码和你的描述之间的匹配。您可以在代码中调用'createGraph'并在您的描述中引用'createArgument'。假设它们是相同的函数,问题是'main'的返回类型必须是'IO()',而'createGraph'的返回类型是'Argument'。 – asm

+0

对不起,这是一个错字。它们都是相同的功能,为了明确起见我想重命名它们。 –

+0

你的代码片段中的main函数是你的程序的主要函数吗?如果是这样的话,do块中的最终表达式必须具有类型'IO()' – asm

回答

2

你为什么要这么做?

让您的价值进入IO monad的唯一方法是使用return。 您可以包住调用createGraph到另一个函数一样

returnGraph a b c = return $ createGraph a b c 

或只使用另一个让绑定,当你需要使用它自己的价值。 我无法弄清楚你想在那里做什么。请告诉我们更多的细节,比如你想用返回的值做什么。

- 从我的理解你的评论你只需要返回参数,所以你必须做的唯一的事情是返回$ createGraph firstargs secondargs常量并重命名从main函数到别的东西,因为main必须有类型IO()。

+0

我有一个需要获取参数才能工作的框架。 我想要做的是将文件中的参数解析为字符串,然后将它们传递给框架以便计算结果。 我想要做的是以下内容 - 让框架调用'main'函数,以便解析文件并返回所需的参数。 所以唯一能做到这一点的方法就是让程序块解析文件并调用框架函数来启动它。 –

+0

好吧,我歪曲了它,就像你建议的那样,现在它可以工作。 谢谢! –

1

问题是,无论什么时候我尝试读入文件,它都会变成一个(IO字符串),我总是必须随身携带IO。

我不认为这是真正的问题。问题是main有返回类型的IO(),这是执行最后一行的结果。在这种情况下,这意味着createGraph调用会导致参数。这就是为什么你会得到类型错误,这与从文件中读取的IO字符串无关。

一种解决方案是简单地在主月底返回createGraph结果:

return $ createGraph firstargs secondargs constant 
相关问题