Show的新实例声明

时间:2010-12-11 17:38:01

标签: haskell

我正在尝试在Haskell中为我创建的新数据类型添加一个实例声明失败。这是我到目前为止所尝试的:

data Prediction = Prediction Int Int Int
showPrediction :: Prediction -> String
showPrediction (Prediction a b c) = show a ++ "-" ++ show b ++ "-" ++ show c
instance Show (Prediction p) => showPrediction p

似乎最后一行是错误的,但我不确定如何实现我想要的。基本上是能够从解释器调用一个Prediction变量并使其可视化而无需调用showPrediction。现在这个有用:

showPrediction (Prediction 1 2 3)

并显示:

"1-2-3"

正如所料,但我希望这可以工作(来自翻译):

Prediction 1 2 3

有什么想法吗?

3 个答案:

答案 0 :(得分:55)

要派生实例,语法为

instance «preconditions» => Class «type» where
  «method» = «definition»

所以在这里,例如,你有

instance Show Prediction where
  show (Prediction a b c) = show a ++ "-" ++ show b ++ "-" ++ show c

没有先决条件;如果 instance Show a => Show [a] where ...可以展示,那么a就是{{1>}。[a]就是Predictions。在这里,所有instance Show (Prediction p) => showPrediction p都是可以显示的,所以没有什么可担心的。当你写Prediction p时,你犯了一些错误。首先,Prediction意味着data Prediction a = Prediction a a a是一个参数化类型(例如,由Show (Prediction p) =>声明的),而不是Prediction P。其次,=>表示如果 Show可显示,然后您想要声明其他实例。第三,在Prediction 1 2 3之后,有一个函数是无意义的 - Haskell想要一个类型类名。

另外,为了完整起见,如果您希望data Prediction = Prediction Int Int Int deriving Show 格式显示输出,还有另一种方法可以派生Eq

Ord

As specified in the Haskell 98 report,只有少数类型可以通过以下方式派生:EnumBoundedShowRead,{{1 }和Data。使用the appropriate GHC extensions,您还可以派生TypeableFunctorFoldableTraversablenewtype;你可以推导出newtype为{{1}}派生的{{1}}包裹类型的类;并且您可以以独立方式生成这些自动实例。

答案 1 :(得分:14)

你的实例语法错误了。要创建Show写实例:

instance Show Foo where
  show = ...
  -- or
  show x = ...

其中...包含show Foo函数的定义。

所以在这种情况下你想要:

instance Show Prediction where
  show = showPrediction

或者,因为根本没有重要的理由showPrediction

instance Show Prediction where
  show (Prediction a b c) = show a ++ "-" ++ show b ++ "-" ++ show c

答案 2 :(得分:4)

将最后一行替换为:

instance Show Prediction where
    show = showPrediction