【问题标题】:Recursion on a list of tuples元组列表上的递归
【发布时间】:2014-11-24 03:59:23
【问题描述】:

我想制作一个程序

  • 将一个字符和一个字符对列表作为参数,
  • 如果它等于输入字符,则返回对的第一个元素,否则返回未更改的对。

我有以下代码:

lookUp :: Char -> [(Char, Char)] -> Char    
lookUp a [] = []
lookUp a [(x,y),(xs,ys)]
   | a == x = y : lookUp [(xs,ys)]
   | otherwise = x : y : lookUp [(xs,ys)]

当我编译它时,我得到了很多错误:

无法将预期类型 'char' 与实际类型 [t0] 匹配

在“查找”的等式中

等等……

抱歉,我对 Haskell 比较陌生。我很确定在递归处理元组 ([(x,y),(xs,ys)]) 时犯了一个错误,但我不知道如何更改它。有什么想法吗?

【问题讨论】:

  • 我不太明白 - 你想要一个字符列表吗?你能准确地说出你想让这个函数做什么吗?
  • 如果要在不同情况下返回一个值和一对,可以将结果类型包装在Either数据类型中。
  • 如果它等于输入字符,则返回对的第一个元素,否则返回未更改的对。你不能这样做。结果的类型不能因一种情况 (Char) 与另一种情况 ((Char,Char)) 不同。请说明您的规格。

标签: haskell character tuples


【解决方案1】:

您的代码的这种修改将类型检查:

-- lookUp :: we'll have GHC tell us the type signature    
lookUp a [] = []
lookUp a ((x,y):pairs)
   | a == x = y : lookUp a pairs
   | otherwise = x : y : lookUp a pairs

一些明显的错误:

  • 当您递归调用 lookUp 时,您只使用一个参数调用它(您忘记了 a 参数)
  • 模式[(x,y),(xs,ys)] 将只匹配正好两对字符的列表。模式((x,y):pairs) 匹配一个非空的对列表。第一对被解构为字符xy,列表的剩余部分绑定到pairs

使用ghci 中的:t 命令让GHC 告诉您类型签名是什么。

现在这是否是您想要的,是另一个问题。

【讨论】:

    猜你喜欢
    • 2019-10-04
    • 1970-01-01
    • 2018-02-20
    • 1970-01-01
    • 2015-12-03
    • 1970-01-01
    • 2014-03-05
    • 2015-06-27
    • 1970-01-01
    相关资源
    最近更新 更多