2

在这里完成 Haskell 的菜鸟,可能还有一个更菜鸟的问题。我正在尝试使 ghci 输出正常工作,并且卡在实例声明上。给定的“(显示(堆栈->堆栈))”实例如何声明:

data Cmd = LD Int
         | ADD
         | MULT
         | DUP
         deriving Show

type Prog = [Cmd]

type Stack = [Int]

type D = Stack -> Stack

我一直在尝试创建一个声明,例如:

instance Show D where show = Stack

但是我所有的尝试都导致了非法的实例声明。非常感谢任何帮助和/或参考!

4

1 回答 1

7

首先,默认情况下,类型同义词(即使用 定义的东西type)在实例声明中是不合法的。但是,有一个 GHC 扩展允许这样做。

除此之外,在这种特定情况下,show需要返回一个String; 您的实例正试图返回一个...类型的同义词名称,它甚至没有任何意义,而且还引用了一个列表Int,这是 . 的错误返回类型show

最后,D是一个函数类型——无论如何,它应该是什么showShow在大多数情况下,对于函数类型上的实例,您实际上并不能做太多有意义的事情。

如果你只是想让它说“这是 D 型”,你可以写一个这样的实例:

{-# LANGUAGE TypeSynonymInstances #-}
instance Show D where show _ = "Stack -> Stack"

不过,我不确定这在实践中有多有用。

于 2010-04-21T21:46:50.153 回答