在Haskell中显示不明确的事件

时间:2015-03-19 15:20:09

标签: haskell

我有一个问题是“显示”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

感谢大家的帮助!

1 个答案:

答案 0 :(得分:2)

class关键字用于定义全新的类型类。你不想定义Show;它已在前奏中定义过了。因此,你应该摆脱

class Show a where
    show :: a -> String

另一个问题是swapSeq定义中的混乱缩进。修复它,否则会出现parse error on input ‘=’错误。

最后,您显然不希望showEl值转换为任何奇特的字符串;你只想使用值的名称。在这种情况下,您可以简单地让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