Haskell:'do'结构中的最后一个语句必须是一个表达式

时间:2011-05-04 16:44:37

标签: haskell syntax io monads

嘿,很遗憾在这里转发错误信息,但我已经尝试了我能找到的所有内容,似乎没什么关系。此代码生成错误:

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'函数中的所有调用。我做错了什么?

由于 -A

2 个答案:

答案 0 :(得分:6)

do表达式中的最后一行缩进太多。

另外,你可以写

load :: String -> IO ()  
load fileName =
    putStr . createNode . lines . head . lines =<< readFile filename

答案 1 :(得分:3)

除了身份识别之外我只能找到的错误是: 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描述的两种类型错误。