我有一个元素列表,我想创建一个这种类型的Haskell函数:
swap :: [Token] -> [Token]
鉴于此数据:data Token = Number | Operator
在函数中,我想检查两个连续的元素(从开始开始)是否是“可交换的”。如果第一个元素为Number
且后一个元素为Operator
,则可以交换两个元素。
我已经开始设计这样的功能,但不知道如何完成它:
swap :: [Token] -> [Token]
swap [] = []
swap (x:xs) = if ( x == Number ) and ( xs!!0 == Operator ) then
-- swap here
else
swap (xs)
我不知道如何进行交换。
感谢您的帮助
答案 0 :(得分:2)
你只需构建一个包含交换元素的列表并将其返回:
data Token = Number | Operator deriving (Eq, Show)
swap :: [Token] -> [Token]
swap (x:y:xs) = if x == Number && y == Operator then
y : x : swap xs
else
x : swap (y : xs)
swap xs = xs
main = putStrLn $ show $ swap [Number, Number, Number, Operator, Operator, Number, Operator, Number]
-- Output: [Number,Number,Operator,Number,Operator,Operator,Number,Number]
或者,您可以使用模式匹配而不是if/else
:
swap :: [Token] -> [Token]
swap (x@Number:y@Operator:xs) = y : x : swap xs
swap (x:xs) = x : swap xs
swap [] = []