所以这里我有单身人士名单
[([("*" "1"),("/" "5"),("*" "10")],"")]
我必须使用<{p>的fst $ head
[("*" "1"),("/" "5"),("*" "10")]
将其与简单字符串"5"
合并,并将其转换为
(("*" "10") (("/" "5") (("* "1") "5")))
我知道这会涉及foldl
或foldr
,但我无法正确理解......
这是一个解析器项目,我可以发布所有背景信息,但那太多了。
提前致谢。
编辑:
这是Haskell btw
啊,想出这个
> prods = do left <- term
> right <- many (mul `mplus` div `mplus` mod)
> return (foldl (\l r -> Call r l) left right)
不要过多地阅读它,基本上它需要5 * 1 / 5 *10
并将它们转换为((* 10) ((/ 5) ((* 1) 5)))
答案 0 :(得分:1)
foldl
取一个起始值,并从最外层的构造函数开始工作,foldr
取一个起始值并从最里面的构造函数中运行。
[1,2,3] -- is just syntactic sugar for
1:2:3:[] -- or
1:(2:(3:[])) -- or
cons 1 (cons 2 (cons 3 [])) where cons a as = a:as
考虑foldr
的一个简单方法是
foldr f z (cons 1 (cons 2 (cons 3 []))) = f 1 (f 2 (f 3 z))
foldr
只需将f替换为cons,将z替换为[]
foldl
反转数据结构,将其内部翻转。
foldl f z (cons 1 (cons 2 (cons 3 []))) = f (f (f z 1) 2) 3
那么你能看出为什么你需要foldl
吗?
您仍然需要将操作员字符串("*"
,"+"
,"/"
)转换为函数,将数字字符串转换为数字,因为"/" "3" "4"
isn'合法的哈克尔申请。