Jestem początkującym Haskellem, dopiero zaczynam owijać głowę wokół Monad, ale tak naprawdę to jeszcze nie rozumiem. Piszę grę, która polega na pytaniu użytkownika o dane wejściowe i odpowiedzi. Tutaj jest uproszczoną wersją mojego funkcji:IO dzieje się niesprawna, gdy używa się getLine i putStr
getPoint :: IO Point
getPoint = do
putStr "Enter x: "
xStr <- getLine
putStr "Enter y: "
yStr <- getLine
return $ Point (read xStr) (read yStr)
completeUserTurn :: (Board, Player) -> IO (Board, Player)
completeUserTurn (board, player) = do
putStr $ "Enter some value: "
var1 <- getLine
putStr $ "Enter another value: "
var2 <- getLine
putStr $ "Enter a point this time: "
point <- getPoint
if (... the player entered legal values ...) then do
putStr $ "This is what would happen if you did that: {stuff} do you want to do that? (y/n) "
continue <- getLine
if continue == "y" then
return (...updated board..., ...updated player...)
else
completeUserTurn (board, player)
else do
putStr "Invalid Move!\n"
completeUserTurn (board, player)
Co się dzieje jest to, że komunikaty będą wyświetlane w porządku z tekstem, który ma się pojawić przed wierszu.
Oto przykład tego, co dzieje się po tym, jak skompilowany kod powyżej:
podać wartość: Wpisz inną wartość:
Wpisz punkt: wpisz x: wprowadź y: y
Czy to prawda? (Y/n).
pogrubiona są rzeczy Wpisałem w
Oczywiście, mam kilka poważnych błędów koncepcyjnych, ale nie wiem co. Zauważ, że działa poprawnie w tłumaczu i kończy się niepowodzeniem podczas kompilacji.
To samo zachowanie jak biblioteki C stdio, oprócz tego, że stdio ma hack, który I twierdził Haskell powinien mieć, jak również, a mianowicie jeśli czytać z stdin potem spłukiwania stdout, jeśli oba są tty. – augustss