私は、私が従うコースのためにハスケルで非常に小さな試合をしなければなりません。だから私は演奏機能を作りましたが、今はタイプシグネチャを変更するのに問題があります。ここでStateTモナドを正しく使うには?
play :: [[String]] -> StateT GameState IO Score
play input =
do
liftIO $ clearScreen
(answered, correct) <- get
if True
then
do
liftIO $ putStrLn "Well done! Your answer was correct!"
liftIO $ putStrLn ("So far, you answered " ++ (show answered) ++ " questions")
put (answered + 1, correct + 1)
liftIO $
do
temp <- getLine
putStrLn temp
else
do
liftIO $ putStrLn "I'm sorry, you're wrong..."
put (answered + 1, correct)
play input
trueの場合、これはテスト用です。今、この関数は動作しますが、別の型シグネチャで動作させる必要があります。機能プレイの型シグネチャは次のようになります。
play :: IO (Either ParseError [[String]]) -> StateT GameState IO Score
しかし、私はその後、私のStateT
モナドを使用する方法について絶対にないアイデアを持っていませんか?これどうやってするの? IO (Either ParseError [[String]])
モナドは、missingH-packageのparseFromFile関数の結果です。
「再生」を変更する必要はありません。 'parseFromFile'を呼び出すのは、その結果に基づいて、' play'を呼び出すかどうかを決定する必要があります。 – chepner
@chepnerしかし、 'IO(どちらかParseError [[String]])'の代わりに '[[String]]'を使ってplayを呼び出すことはできますか?私は '[[String]]'右へのアクセス権を持っていません。 –
'lift :: IO(ParseError [[String]]) - > StateT GameState IO(どちらか...)'を使用して、モナドバインド( '>> ='または 'do'ブロック内)をonこの値。 'ParseError'に対処する必要があります。おそらく、例外を投げたり、モナドを' StateT GameState(ErrorT SomeErrorType IO) 'に変更してください。 – user2407038