Haskell代码打印出一个整数列表,而不是字符列表

时间:2018-11-10 00:20:16

标签: haskell

我的代码当前看起来像这样。应该在预先给我们的正则表达式定义中显示可能的第一个符号。我应该将它们打印为列表。例如,如果答案应为[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

1 个答案:

答案 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无关。全部。