所以我试图定义自己的数据类型,递归地表达自然数,如下:
To create struct function passed to udf has to return Product type (Tuple* or case class), not Row.
此功能正常工作:
data Nat = Zero | Succ Nat
但是,我不想每次想要将Nat输出到屏幕时都要调用它。我试过这个:
showNat :: Nat -> String
showNat Zero = "Zero"
showNat (Succ k) = "Succ " ++ (showNat k)
但它返回错误:
instance Show Nat where
show Zero = "Zero"
show (Succ k) = "Succ " ++ Main.show k
如何正确编写“显示”的实例?
答案 0 :(得分:4)
实例化似乎过于复杂。这就足够了:
data Nat = Zero | Succ Nat
showNat :: Nat -> String
showNat Zero = "Zero"
showNat (Succ k) = "Succ " ++ (showNat k)
instance Show Nat where
show = showNat
或者,您可能希望使用自动生成的show
使用deriving
:
data Nat = Zero | Succ Nat deriving (Show)
在这种情况下,nat将显示为Succ (Succ Zero)
,而不是原始代码中的Succ Succ Zero
。
答案 1 :(得分:1)
只是为了澄清,没有缩进,你做了两件事:
定义instance Show Nat
而不实施其中的任何功能
定义一个名为show
的无关函数。这就是为什么
仅使用“show”(我最初做过)会出现“不明确的错误”
范围内有两个show
函数,Haskell规则不优先考虑其中一个。