繁体   English   中英

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

[英]Swapping two successive elements in a list

我有一个元素列表,我想创建这种类型的Haskell函数:

swap :: [Token] -> [Token]

给定此数据: data Token = Number | Operator 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)

我不知道如何进行交换。

谢谢你的帮助

您只需要构造一个交换了元素的列表并返回它:

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 [] = []

运行

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM