Haskell: последнее утверждение в конструкции do должно быть выражением - PullRequest
3 голосов
/ 04 мая 2011

Привет, извините, что выбросил здесь сообщение об ошибке, но я перепробовал все, что смог найти, и ничего не показалось актуальным.Этот код генерирует ошибку:

import System.Environment   
import System.Directory  
import System.IO  
import Data.List  

data Node = PathNode String Float Float [String] | NoNode deriving (Show)


main = do
    (filename:args) <- getArgs  
    load filename


load :: String -> IO ()  
load fileName = do
    contents <- readFile fileName  
    let pathStrings = lines contents
        first = head pathStrings
        args = lines first
        path = createNode args
        putStr path


createNode [String] -> Node
createNode (name:x:y:paths) = PathNode name x y paths
createNode [] = NoNode

Я знаю, что это как-то связано с выравниванием, но я правильно выровнял все вызовы в функции load.Что я делаю не так?

Спасибо -А

Ответы [ 2 ]

6 голосов
/ 04 мая 2011

Последняя строка в выражении do имеет слишком большой отступ.

Кроме того, вы можете просто написать

load :: String -> IO ()  
load fileName =
    putStr . createNode . lines . head . lines =<< readFile filename
3 голосов
/ 04 мая 2011

Только ошибки, которые я могу найти, кроме идентификации: in load: putStr ожидает String, тогда как path имеет тип Node.в createNode: Pathnode требует, чтобы x и y имели тип Float, тогда как вы предоставляете Strings.

load :: String -> IO ()  
load fileName = do
    contents <- readFile fileName  
    let pathStrings = lines contents
        first = head pathStrings
        args = lines first
        path = createNode args
    putStr $ show path


createNode :: [String] -> Node
createNode (name:x:y:paths) = PathNode name (read x) (read y) paths
createNode [] = NoNode

Это решает оба типа ошибок, описанных с помощью show и read.

...