4

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

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

      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
4

2 回答 2

8

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

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

应该给你'q'。

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

当你给它一些但不是全部数据时,Haskell 将其解释为一个接受下一个参数的新函数,所以

lookUp 'c'

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

顺便说一句,几乎每次你得到一个“没有实例...”的错误,那是因为你在参数上做错了——错过了一些,把它们按错误的顺序排列。编译器试图通过建议您添加一个实例来提供帮助,但可能您只需要检查您是否以正确的顺序提供了参数的写入类型。

玩得开心学习 Haskell!

于 2012-10-10T01:02:45.783 回答
5

看来您在 ghci 中输入了这样的内容:

*Main> lookUp 'c'

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

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

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

要测试您的功能,请确保同时提供这两者x和对列表Char

*Main> lookUp 'c' [ ('a','A'), ('b','B'), ('c','C') ]
'C'
于 2012-10-10T01:01:38.683 回答