2

ファイルからデータを取得して解析し、別の関数に引数として渡そうとしています。

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 String) になり、何をするにしても常に 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。これは、引数を渡す必要がある大きなフレームワークの一部であるためです。これに対処する方法は何ですか?

4

2 に答える 2

2

なぜそれをしたいのですか?

値を IO モナドに入れる唯一の方法は、return を使用することです。createGraph への呼び出しを次のような別の関数にラップすることができます

returnGraph a b c = return $ createGraph a b c

または、別の let バインディングを使用して、必要なときに値を使用します。そこで何をしたいのかわかりません。返された値で何をしたいのかなど、詳細を教えてください。

- あなたのコメントから私が理解していることから、引数を返すだけでよいので、必要なのは $ createGraph firstargs secondargs 定数を返し、関数の名前を main から別のものに変更することだけです。

于 2012-10-09T00:22:05.560 に答える
1

問題は、ファイルを読み込もうとするたびに (IO String) になり、何をするにしても常に IO を実行する必要があることです。

これが本当の問題だとは思いません。問題は、 main が最後に実行された行の結果である IO() の戻り型を持つことです。この場合、それはcreateGraphArgument になる呼び出しを意味します。これが、ファイルから読み取られる IO 文字列とは関係のないタイプ エラーが発生する理由です。

createGraph1 つの解決策は、main の最後で単に結果を返すことです。

return $ createGraph firstargs secondargs constant
于 2012-10-09T00:35:38.083 に答える