Haskell:使用foldl级联函数

时间:2011-11-09 04:47:55

标签: haskell lambda

所以这里我有单身人士名单

[([("*" "1"),("/" "5"),("*" "10")],"")]

我必须使用<{p>的fst $ head

[("*" "1"),("/" "5"),("*" "10")]

将其与简单字符串"5"合并,并将其转换为

(("*" "10") (("/" "5") (("* "1") "5")))

我知道这会涉及foldlfoldr,但我无法正确理解......

这是一个解析器项目,我可以发布所有背景信息,但那太多了。

提前致谢。

编辑:

这是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)))

1 个答案:

答案 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'合法的哈克尔申请。