没有(Show([(Char,Char)] - > Char)的实例)

时间:2012-10-10 00:55:09

标签: haskell compiler-errors ghci

所以我必须创建一个函数,找到第一个字母的一对并返回第二个字母。

我实际上找到了一个答案,但是使用了map功能,我无法得到它。

      lookUp :: Char -> [(Char, Char)] -> Char
      lookUp x [] = x
      lookUp x ( ( st,nd ): rst) | st == x = nd
                   | otherwise = lookUp x rst

我收到了这条消息:

No instance for (Show ([(Char, Char)] -> Char))
arising from a use of `print'
 Possible fix:
  add an instance declaration for (Show ([(Char, Char
  In a stmt of an interactive GHCi command: print it

2 个答案:

答案 0 :(得分:8)

您的代码很好,您只需要在ghci提示符下提供所有参数,例如

lookUp 'c' [('b','n'), ('c','q')]

应该给你'q'。

它抱怨它无法显示功能。任何时候它说它没有 有一个Show实例用于 - >在,它抱怨它不能 显示一个功能。它只能显示在某些数据上使用该函数的结果。

当你给它一些但不是所有数据时,Haskell将它解释为一个新函数 这需要下一个参数,所以

lookUp 'c'

是一个函数,它将获取一对字符列表并为您提供一个字符。 这就是它试图展示的东西,但却不能。

顺便说一句,几乎每当你得到“No instance for ...”错误时,都是因为 你做了一些错误的论点 - 错过了一些,把它们放进去 错误的订单。编译器的尝试通过建议您添加来提供帮助 一个实例,但可能你只需要检查你提供的写类型 正确的论点。

有乐趣学习Haskell!

答案 1 :(得分:4)

您似乎在ghci中输入了类似的内容:

*Main> lookUp 'c'

lookUp 'c'这样的表达式是lookUp函数的部分评估/ curried形式。它的类型是:

*Main> :t lookUp 'c'
lookUp 'c' :: [(Char, Char)] -> Char

这是ghci说没有Show实例的确切类型。

要测试您的功能,请确保同时提供xChar对列表:

*Main> lookUp 'c' [ ('a','A'), ('b','B'), ('c','C') ]
'C'