我正在尝试在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
有什么想法吗?
答案 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,只有少数类型可以通过以下方式派生:Enum
,Bounded
,Show
,Read
,{{1 }和Data
。使用the appropriate GHC extensions,您还可以派生Typeable
,Functor
,Foldable
,Traversable
和newtype
;你可以推导出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