【问题标题】:Working with list of tuples in Haskell在 Haskell 中使用元组列表
【发布时间】:2013-03-11 15:41:41
【问题描述】:

我在 Haskell 中有一个 10 元组的列表,我想从该元组列表中获取第 n 个元组。但正如我所见,只有 length 函数适用于该列表。 headtail!! 功能不起作用。你能告诉我我该怎么做吗?元组由整数和字符串组成。 例如当我尝试这个时:

tail [(3,5,"String1","String2","String3","String4","String5","String6","String7","String8"),(3,5,"String1","String2","String3","String4","String5","String6","String7","String8"),(3,5,"String1","String2","String3","String4","String5","String6","String7","String8")]

我从拥抱中收到此错误消息:

ERROR - Cannot find "show" function for:
*** Expression : tail [(3,5,"String1","String2","String3","String4","String5","String6","String7","String8"),(3,5,"String1","String2","String3","String4","String5","String6","String7","String8"),(3,5,"String1","String2","String3","String4","String5","String6","String7","String8")]
*** Of type    : [(Integer,Integer,[Char],[Char],[Char],[Char],[Char],[Char],[Char],[Char])]

【问题讨论】:

  • 您的示例非常适合我,并提供[(3,5,"String1","String2","String3","String4","String5","String6","String7","String8"),(3,5,"String1","String2","String3","String4","String5","String6","String7","String8")]。但是,与这些巨型元组相比,使用结构仍然会更好。
  • 你用的是什么解释器?对我来说,它看起来像拥抱......自 6.12.2 版(2010 年发布)以来,GHCi 至少支持多达 60 个组件的元组(包括显示实例,这是这里的问题)。
  • 谢谢你警告我。我正在使用拥抱。在阅读了你所说的之后,我看到它适用于 ghci,但它不适用于拥抱。我应该怎么做才能让它也适用于拥抱?你有什么想法吗?
  • 为具有超过 7 个 (IIRC) 组件的元组编写您自己的 Show 实例。但是最后一次发布的拥抱是从 2006 年秋季开始的,所以拥抱几乎已经死了。可悲,但这就是生活。转移到 ghci,它带有一个编译器以获得额外的好处。
  • instance (Show a, Show b,...) => Show (a,b,...) where show (x,y,...) = "(" ++ show x ++ "," ++ show y ++ ... ++ ")"。初级,但很乏味。当然,您可以自动生成实例。

标签: list haskell tuples


【解决方案1】:

以下是为 3 元组声明 Show 实例的方法。希望这能说明这个想法,您可以将其扩展到更多元素:

导入 Data.List(插入) 实例 (显示 a, 显示 b, 显示 c) => 显示 (a, b, c) 其中 show (a, b, c) = "(" ++ (intercalate "," ([show a, show b, show c])) ++ ")"

您可以像逻辑含义一样阅读实例声明:如果我可以显示类型 a、b 和 c 的值,那么我可以显示类型的元组(a, b, c),方法如下。

GHC 为最多 15 个元组的所有内容定义了一个 Show 实例,因此您可能不需要在您的情况下定义它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-28
    • 2012-02-29
    • 1970-01-01
    • 2018-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多