【发布时间】:2014-03-25 03:28:56
【问题描述】:
假设我定义了一个数据类型如下:
data OP = Plus | Minus | Num Int deriving (Show, Eq)
然后我获取strings 的列表,并获取它们各自的OP 值列表,如下所示:
getOp :: [String] -> [OP]
getOp [] = []
getOp (x:rest)
| x == "+" = Plus:(getOp rest)
| isInfixOf "Num" x == True = Num (read (drop 4 x) :: Int):(getOp rest)
| otherwise = "-" = Minus:(getOp rest)
然后我想显示[OP] 列表,用新行分隔。我已经很容易地用字符串列表完成了它,但不确定如何处理数据类型列表。
我有以下结构作为起点:
showOp :: [OP] -> String
showOp [] = []
showOp (o:os) = (putStr o):'\n':(showOp os)
我知道最后一行是错误的。我试图在第一部分返回[Char],然后是Char,然后是递归调用。我为最后一行(见下文)尝试了一些其他变体,但没有成功。
showOp o = show o (works but not what I need. It shows the whole list, not each element on a new line
showOp o = putStrLn (show o) (epic fail)
showOp o
| o == "+" = "Plus\n":(showOp os)
| more of the same. Trying to return a [Char] instead of a Char, plus other issues.
另外,我不确定Num Int 类型的输出需要如何不同,因为我需要显示类型名称和值。
这方面的示例 i/o 如下所示:
在:
getOp ["7","+","4","-","10"]
出来:
Num 7
Plus
Num 4
Minus
Num 10
【问题讨论】:
-
永远不要说 x==True。直接说 x。
标签: function haskell types show