我收到类型错误,我不知道为什么

时间:2014-11-15 16:41:21

标签: haskell

我有这段代码,但是这个错误出现了,我不知道为什么:

Couldn't match type 'Char' with '[Char]'
    Expected type: [String]
      Actual type: String
    In the return type of a call of 'tarefa'
    In the first argument of 'unlines', namely '(tarefa (lines inp))'
    In the first argument of 'putStrLn', namely
      '(unlines (tarefa (lines inp)))'



main = do inp <- getContents; putStrLn (unlines (tarefa (lines inp)))

tarefa :: [String]-> String
tarefa tab = let board = getBoard tab 
                 valid = valBoard board 
                 ym = length board
                 xm = length (head board)
                 (r:p:s) = drop (length board) tab
             in if valid/=0 then [show valid]                   
                            else if not (coordOK xm ym r)
                                 then [show (ym +1)]
                                 else if not (progOK p)
                                      then [show (ym+2)]
                                      else if s /= []
                                           then [show (ym+3)]
                                           else ["OK"]

2 个答案:

答案 0 :(得分:4)

unlines需要一个字符串列表,它将与'\n'个字符一起加入。但是,tarefa的类型声明表示它返回一个String。

查看您的实现,看起来tarefa意味着返回一个字符串列表;我认为你只需要修改类型声明来反映这一点。

涉及字符串的类型错误可能令人困惑,因为String[Char]的类型同义词,并且编译器在错误消息中引用的是哪一个不一致。

答案 1 :(得分:1)

两个问题:

  1. 您认为这个表达的类型是什么:

    [ “OK”]

  2. (提示:你可以问ghci)?

    1. 那么,为什么你声称你的函数返回String