我正在尝试根据以下步骤重新排列列表:
例
[“ 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] 删除。
我来说两句