我有一个问题是“显示”Haskell中一个简单函数的结果。 “赋值”是:返回一个等于过去的序列,其中每个值“War”被替换为值“Star”,反之亦然:
data El = Star | War
class Show a where
show :: a -> String
instance Show El where
show Star = "Star"
show War = "War"
swapSeq :: [El] -> [El]
swapSeq [] = []
swapSeq (Star:xs) = Star : swapSeq xs
swapSeq (War:xs) = War : swapSeq xs
感谢大家的帮助!
答案 0 :(得分:2)
class
关键字用于定义全新的类型类。你不想定义Show
;它已在前奏中定义过了。因此,你应该摆脱
class Show a where
show :: a -> String
另一个问题是swapSeq
定义中的混乱缩进。修复它,否则会出现parse error on input ‘=’
错误。
最后,您显然不希望show
将El
值转换为任何奇特的字符串;你只想使用值的名称。在这种情况下,您可以简单地让Haskell自动为您的数据类型派生Show
,方法是在数据声明后粘贴deriving Show
;这比使用El
关键字Show
instance
实例更容易。
data El = Star | War deriving Show
swapSeq :: [El] -> [El]
swapSeq [] = []
swapSeq (Star:xs) = Star : swapSeq xs
swapSeq (War:xs) = War : swapSeq xs