我的代码当前看起来像这样。应该在预先给我们的正则表达式定义中显示可能的第一个符号。我应该将它们打印为列表。例如,如果答案应为[1,2],则结果将为[1,2],但当答案应为['1','2']时,结果将为“ 12”或当它应该是['a','b']时,它将出来“ ab”。我在做什么错了?
data RE a -- regular expressions over an alphabet defined by 'a'
= Empty -- empty regular expression
| Sym a -- match the given symbol
| RE a :+: RE a -- concatenation of two regular expressions
| RE a :|: RE a -- choice between two regular expressions
| Rep (RE a) -- zero or more repetitions of a regular expression
| Rep1 (RE a) -- one or more repetitions of a regular expression
deriving (Show)
firstMatches :: RE a -> [a]
firstMatches Empty = []
firstMatches (Sym a)= a:list
firstMatches(Rep(a))=firstMatches a
firstMatches(Rep1(a))=firstMatches a
firstMatches (Empty :+: b)= firstMatches b
firstMatches (a :+: _) = firstMatches a
firstMatches (a :|: b)= firstMatches a ++ firstMatches b
答案 0 :(得分:2)
您没有做错任何事情。
String
是[Char]
的类型同义词,因此,如果您尝试打印[Char]
,它将打印为String
。这有点特殊,可能有点怪异。
Show
是用于将内容打印为字符串的类型类。 Show
的定义是这样的:
class Show a where
showsPrec :: Int -> a -> ShowS
show :: a -> String
showList :: [a] -> ShowS
showList
功能是可选的。 documentation指出:
提供方法
showList
是为了允许程序员提供一种特殊的方式来显示值列表。例如,它由Show
类型的预定义Char
实例使用,其中String
类型的值应该用双引号而不是方括号括起来。
因此,如果您定义一个新类型并实例化Show
,则可以选择定义一种特殊方式来show
列出您的类型,这与通常显示的方式以及与方法的清单不同通常显示。 Char
利用了这一点,因为[Char]
(或等效的String
)用双引号而不是Char
值的列表显示。 / p>
我想不出一种方法来使它对show
使用默认的[Char]
。我不认为有一个。一种解决方法是使用自己的newtype
创建一个Char
包装Show
并使用默认的showList
实现,但这似乎不合适。
如果这是家庭作业,我希望评分者已经知道这一点,并且我严重怀疑您是否为此而被打分,尤其是因为问题似乎与show
无关。全部。