[英]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.