Haskell - 读取文件并将数据作为参数传递给函数

时间:2012-10-09 00:13:29

标签: parsing haskell io

我正在尝试从文件中获取一些数据,然后解析它并将其作为参数传递给另一个函数。

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函数的返回类型,因为它是我需要提供参数的大型框架的一部分。 有什么方法可以解决这个问题?

2 个答案:

答案 0 :(得分:2)

你为什么要这样做?

将值传入IO monad的唯一方法是使用return。 您可以将createGraph的调用包装到另一个函数中,如

returnGraph a b c = return $ createGraph a b c

或者只是使用另一个let绑定并在需要时使用您的值。 我无法弄清楚你想在那里做什么。请告诉我们更多细节,如你想对返回值做什么。

- 根据我从你的评论中理解,你只需要返回参数,所以你唯一需要做的就是返回$ createGraph firstargs secondargs constant并将函数从main重命名为其他东西,因为main必须有类型IO()。

答案 1 :(得分:1)

  

问题在于,每当我尝试读入文件时,它就变成了(IO字符串),无论我做什么,我都必须随身携带IO。

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

一种解决方案是简单地在main的末尾返回createGraph的结果:

return $ createGraph firstargs secondargs constant