如何根据一组步骤重新排列列表?

阿斯吉尔·比兰(Asgeir Bjelland)

我正在尝试根据以下步骤重新排列列表:

  1. 首先通过将每个运算符(+,-,*)的索引向左移动1,方法是将其与元素向左切换。
  2. 然后在*之前找到两个'+'或'-'索引,然后将'+'或'-'移至*之前的索引。

[“ a”,“-”,“ 2”,“ *”,“ b”,“ +”,“ c”]

[“-”,“ a”,“ *”,“ 2”,“ +”,“ b”,“ c”]

[“-”,“ a”,“ +”,“ *”,“ 2”,“ b”,“ c”]

我有命令式的编程背景,所以我的最初想法是将迭代器作为参数,并像这样跟踪索引中的位置,但是我无法使其工作。我的第二个想法是拥抱Haskell并在生成器中使用列表理解功能,但是我也很努力。任何想法或解决方案表示赞赏!

威廉·范昂塞姆

您可以使用显式递归例如,您可以使用以下命令将元素向左移动一个位置:

isOperator :: String -> Bool
isOperator "+" = True
isOperator "-" = True
isOperator "*" = True
isOperator _ = False

stepOne :: [String] -> [String]
stepOne (x:xs@(o:xs'))
    | isOperator o = o : x : stepOne xs'
    | otherwise = x : stepOne xs
stepOne xa@[_] = xa
stepOne [] = []

此处,(x:xs@(o:xs'))模式与包含两个或更多元素的列表匹配。第一个元素为x,第二个元素为o其余元素存储在xs'变量中。xs是“外部”缺点的尾巴。我们检查是否o是运算符,如果是这种情况,我们交换x并在尾部递归xs'如果o不是运算符,则在尾部递归xs'

对于给定的样本数据,我们得到:

Prelude> stepOne ["a","-","2","*","b","+","c"]
["-","a","*","2","+","b","c"]

我将第二步保留为练习。

话虽如此,Haskell的成功案例之一可能正在解析。存在一些库和工具,例如parsec[Hackage]attoparsec[Hackage]happy[haskell.org]是一个编译器编译器,可以根据语法,在Haskell中构造解析器。因此,您本身并不需要执行从前缀到前缀的转换,而是让工具为您完成工作。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章