在列表中交换两个连续的元素

时间:2016-12-07 23:11:37

标签: haskell functional-programming

我有一个元素列表,我想创建一个这种类型的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)

我不知道如何进行交换。

感谢您的帮助

1 个答案:

答案 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]

Run it

或者,您可以使用模式匹配而不是if/else

swap :: [Token] -> [Token]
swap (x@Number:y@Operator:xs) = y : x : swap xs
swap (x:xs) = x : swap xs
swap [] = []

Run it