【问题标题】:Haskell declaring an instance of Show classHaskell 声明 Show 类的一个实例
【发布时间】:2023-03-29 10:10:02
【问题描述】:

我正试图围绕 Haskell 中的类和数据结构展开思考,特别是声明它的类型实例。我可以让它与一些类和数据类型一起工作,但不是全部,所以我必须遗漏一些东西。具体来说,我有以下数据声明:

data LinkedList a = End | Link a (LinkedList a)

我想为该类型声明一个 Show 实例,以便输出看起来接近“el1, el2, el3, el4, ...”

instance Show LinkedList where
    show (End) = "."
    show (Link a b) = show a ++ "," ++ show b

正如预期的那样,这不起作用...知道为什么吗?我想我理解“数据”和“类型”的含义,但我不确定我是否对类和实例感到满意。谢谢

【问题讨论】:

  • 你得到什么错误?请edit您的问题包含此重要细节。

标签: class haskell instance show


【解决方案1】:
instance Show LinkedList where

LinkedList 不是类型,LinkedList a 是类型。纠正这一点,我们得到

instance Show (LinkedList a) where

然后,我们得到另一个错误,因为我们在 a 类型的值上调用 show。我们需要要求a 也属于Show 类。

instance Show a => Show (LinkedList a) where

现在应该可以了。

【讨论】:

  • 谢谢!那么为什么 LinkedList 不是一个类型呢?
  • @OmarKahol 因为它缺少论据。它是一种* -> * 的构造函数,即(大致)一个从类型到类型的函数,我们需要向它传递一个参数来获取一个类型。
  • @OmarKahol LinkedList 是一个产生类型的“类型级函数”。它不是一个类型,就像 (* 5) 不是一个数字一样,但是如果你传递一个数字,你就会得到一个数字。
  • @OmarKahol:您可以使用 GHCi 中的 :kind 命令了解有关种类的更多信息。 :kind Show 给出了* -> Constraint,因为Show 是一个类型类,它采用* 的类型(一种“基本类型”,包含值)并返回一个约束; :kind LinkedList 给出了* -> *,因为LinkedList 是一个类型构造函数,它接受一种* 的类型并产生一个类型,也是一种*。所以你不能写Show LinkedList,因为** -> *不匹配——这是一种类型错误,就像类型级别的类型错误。 *也可以写成Type(从GHC.Types导入)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-06
相关资源
最近更新 更多