func声明中的类型错误

时间:2010-10-18 11:24:38

标签: haskell

我做:

Prelude> "sone" ++ "otehr"
"soneotehr"

但是这样的代码:

addOneToElement :: [a] -> [a]
addOneToElement element = element ++ "next"

main = do
   let s = addOneToElement("some")
   putStrLn s

生成此输出:

all_possible_combinations.hs:22:37:
    Couldn't match expected type `a' against inferred type `Char'
      `a' is a rigid type variable bound by
          the type signature for `addOneToElement'
            at all_possible_combinations.hs:21:20
      Expected type: [a]
      Inferred type: [Char]
    In the second argument of `(++)', namely `"next"'
    In the expression: element ++ "next"

为什么我会收到此错误以及如何解决?

2 个答案:

答案 0 :(得分:6)

您的类型签名应为:

addOneToElement :: [Char] -> [Char]

(或者更简单地说,addOneToElement :: String -> String

您的类型签名中的“a”是一个通配符 - 它可以匹配任何内容。但是,您尝试将Char列表连接到任何列表 - 并且无法执行此操作。

答案 1 :(得分:1)

为什么你在这里使用类型变量? 匹配的唯一类型是Char,因为(++)的第二个操作数固定为[Char]"next")。