Сдвинь объявления и определения ф-ций в положенное место.
main = do
putStrLn "Start point: "
start <- getArg
putStrLn "End point: "
end <- getArg
putStrLn "Max cost: "
costStr <- getArgNum
let cost = read costStr :: Double
mapM_ putStr $ astar graph1 start end cost
putStrLn " "
----------------CHECK BUKVI--------
getArg :: IO String -- И так все что ниже
getArg = do
line <- getLine
Но у тебя там еще другие проблемы.
getArgNum ...
getArgNum :: IO Double
getArgNum = do
line <- getLine
if numOk line
then return (read line :: Double)
else do
putStrLn "Please input a proper number:"
getArgNum -- У тебя было getArg
costStr <- getArg -- у тебя было getArgNum
let cost = read costStr :: Double