美文网首页Haskell
[Haskell] foldr与foldl

[Haskell] foldr与foldl

作者: 何幻 | 来源:发表于2016-03-03 07:19 被阅读186次

1. foldr定义

foldr f z (x : xs) = f x (foldr f z xs) 
foldr f _ [] = _  

例子:

foldr + 0 [1 2]
= + 1 (foldr + 0 [2])
= + 1 (+ 2 (foldr + 0 []))
= + 1 (+ 2 0)
= 3

2. foldl定义

foldl f z (x : xs) = foldl f (f z x) xs 
foldl f _ [] = _ 

例子:

foldl + 0 [1 2]
= foldl + (+ 0 1) [2]
= foldl + (+ (+ 0 1) 2) []
= + (+ 0 1) 2
= 3

3. 使用foldr定义foldl

foldl f v xs = foldr (\x g -> (\a -> g (f a x))) id xs v

注:
(1)可以使用一个temp函数简化定义,

foldl f v xs = foldr temp id xs v
    where temp x g = \a->g (f a x)

(2)Currying以后还可以写为,

foldl f v xs = foldr temp id xs v
    where temp x g a = g (f a x)

例子:

foldl + 0 [1 2]
= foldr temp id [1 2] 0

 foldr temp id [1 2]
= temp 1 (foldr temp id [2])
= temp 1 (temp 2 (foldr temp id []))
= temp 1 (temp 2 id)
= temp 1 (\a->id (+ a 2))
= temp 1 (\a->+ a 2)
=\a->(\a->+ a 2) (+ a 1)
=\a->+ (a + 1) 2

foldr temp id [1 2] 0
=(\a->+ (a + 1) 2) 0
=+ (0 + 1) 2
=3

相关文章

  • [Haskell] foldr与foldl

    1. foldr定义 例子: 2. foldl定义 例子: 3. 使用foldr定义foldl 注:(1)可以使用...

  • Haskell笔记3

    1.foldr foldr::(a->b->b)->b->[a]->b foldr函数应用在list上,它的功能就...

  • 函数式的宗教-00: 认识lisp(clojure)与haske

    总体大纲: lisp与haskell简单介绍 lisp与haskell应用领域 lisp与haskell技术分析 ...

  • monad以及monad的四条定理

    haskell的范畴是hask范畴(haskell的所有类型隶属于hask范畴),所以haskell的所有函子都是...

  • 01 数据类型

    swift中结构体在haskell中的描述 枚举类型在haskell中的描述 枚举携带类型在haskell中描述 ...

  • [Haskell] Monoid

    其中m是一个具体类型(:k m = *)。 注: foldr定义为: Monoid Law(1)mempty `...

  • [Haskell] DFS与BFS

    1. DFS 2. BFS 参考 Algorithms: A Functional Programming App...

  • [Haskell] 数字类型之间的转换

    受Common Lisp与Scheme影响,Haskell提供了多种类型的数字。使用类型类(type class)...

  • Haskell学习-函数式编程初探

    原文地址:Haskell学习-函数式编程初探  为什么要学习函数式编程?为什么要学习Haskell?  .net到...

  • Haskell

    [TOC] Haskell GHCI 通过Tab可以自动补全 通过 :browser 模块名称,浏览该模块下的函数...

网友评论

    本文标题:[Haskell] foldr与foldl

    本文链接:https://www.haomeiwen.com/subject/sfpnkttx.html