首页
学习
活动
专区
圈层
工具
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Monadic Function_Haskell笔记12

xss = xss >>= (\xs -> xs) joinList' xss = [y | x <- xss, y <- id x] Writer的场景与List类似,运算都是由>>=完成的,而Maybe...是\ x -> liftA2 (\ flg -> if flg then (x:) else id) (p x),对当前元素用liftA2做映射,视p x的结果返回x:或id(保留的话,把当前元素插入到结果集...-> m,具体见Data.Foldable foldM foldl对应的monadic版本叫foldM: foldl :: Foldable t => (b -> a -> b) -> b -> t a...) 0 [1..10] 55 P.S.一个小细节,foldl与foldr的累加函数的参数顺序是相反的,前者是a v,后者是v a 如果希望给foldl添上一个计算语境(比如可能会失败的语境),用foldM...: foldM' acc a xs = foldl (\ma v -> ma >>= (\a -> acc a v)) (return a) xs 关键点在于维护累加值的context,参与运算(喂给acc

93430
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    C++17,标准库新引入的并行算法

    map 和 scanl1. reduce 对应 foldl 或者 foldl1. transform_reduce 对应 map 和 foldl 的组合或者 map 和 foldl1 的组合....开始讲解之前,让我简单说一下这些方法的功能作用. map 可以对一个列表应用一个函数 foldl 和 foldl1 可以对一个列表应用一个二元运算并将结果归纳为一个数值.foldl 与 foldl1 相比额外需要一个初始值.... scanl 和 scanl1 的操作与 foldl 和 foldl1 基本一致,但是他们会产生所有的中间结果,所以最终你会获得一个列表,而不是一个数值. foldl, foldl1, scanl 和...第一个函数将列表中的元素映射为元素的长度,第二个函数则将这些映射的长度相加.(9) 中的操作和 (7) 很相似,不同之处在于 foldl 只产生一个数值(而不是列表)并且需要一个初始元素(我指定初始元素为...std::cout << "transform_reduce: " << res7 << std::endl; std::cout << std::endl; return 0; } 与

    1.1K20

    从惰性IO说起_Haskell笔记6

    一.惰性I/O与buffer Haskell中,I/O也是惰性的,例如: readThisFile = withFile "....所以,为了解决这个问题,就像引入foldl的严格版本(非惰性版本)foldl'一样,我们引入了ByteString P.S.上面提到的“承诺”,其实在Haskell有个对应的术语叫thunk ByteString...Bytestring的每个元素都是一个字节(8个bit),分惰性与严格(非惰性)两种: 惰性:Data.ByteString.Lazy,同样具有惰性,但比List稍微勤快一些,不是逐元素的thunk,...List的大多数方法在ByteString都有同名的对应实现,例如: head, tail, init, null, length, map, reverse, foldl, foldr, concat...,用于在左侧插入元素,同样是惰性的(即便第一个chunk足够容纳新元素,也插入一个chunk),而cons'是其严格版本,会优先填充第一个chunk的剩余空间,区别类似于: > Prelude.foldr

    2.3K30

    Haskell lambda 与 $ 与 函数组合

    lambda lambda就是匿名函数,有些时候我们会需要一个函数而这个函数可能只用到一次,并没有重用的场景,我们就可以搞一个 临时 的匿名函数来满足我们的计算。...$ $函数,也叫作函数调用符,它的定义如下 ($) :: (a -> b) -> a -> b f $ x = f x 普通的函数调用符有最高的优先级,而 的优先级则最低。...用空格的函数调用符是左结合的,如 f a b c 与 ((f a) b) c 等价,而 则是右结合的 $是优先级最低的中缀右结合函数,从签名来看,只是个函数调用符,相当于在右边加括号 tip: $是个中缀函数...以下面的函数为例: sum’ :: (Num a) => [a] -> a sum’ xs = foldl (+) 0 xs 等号的两端都有个 xs。...foldl (+) 0 回传的就是一个取一 List 作参数的函数,我们把它修改为 sum' = foldl (+) 0,这就是 point free style。

    8110

    函数式思维(二)-- 为何你想不到用 reduce

    上次我写了一篇简单介绍函数式思维的文章,我们组的同学看了之后表示很感兴趣,希望我有空多写写这方面的内容,然后表示他能想到用数组的 map,但是想不到 reduce。...但其实呢,reduce 是个比 map、flatMap 啥的更通用的函数,你可以用 reduce 轻易地实现其他函数。...我们先实现一下 reduce: // foldl const reduce = (reducer, acc) => list => { const [head, ...rest] = list;...reducer 可以接收四个参数(比我的版本多了 currentIndex 和 array),有 currentIndex 这个参数,就告诉我们它的实现大概率是通过循环做的,说实话个人感觉后面两个参数基本是没用的...然后再解释下为啥我的 reduce 不是直接接收三个参数,而要用部分应用的形式,先接收两个,返回一个接收一个参数的函数呢?

    36320

    C++的对象与类的含义

    不同的是,通过结构体定义出来的变量还是叫变量,而通过类定义出来的变量有了新的名称,叫做对象(Object)。...可以将类看做是结构体的升级版,C语言的晚辈们看到了C语言的不足,尝试加以改善,继承了结构体的思想,并进行了升级,让程序员在开发或扩展大中型项目时更加容易。...在C语言中,我们会把重复使用或具有某项功能的代码封装成一个函数,将拥有相关功能的多个函数放在一个源文件,再提供一个对应的头文件,这就是一个模块。使用模块时,引入对应的头文件就可以。...类由一组相关联的函数、变量组成,你可以将一个类或多个类放在一个源文件,使用时引入对应的类就可以。...面向对象编程是针对开发中大规模的程序而提出来的,目的是提高软件开发的效率。不要把面向对象和面向过程对立起来,面向对象和面向过程不是矛盾的,而是各有用途、互为补充的。

    19620

    Laravel之Pipeline1. 背景2. 基本操作3. 动手实现4. Laravel中Pipeline实现5. 总结

    foldLeft 让我们对foldLeft函数更进一步,看下他的函数类型 foldLeft :: (b -> a -> b) -> b -> t a -> b 此处(b -> a -> b)是函数$f的类型...,根据上面的定义,如果我们现在数组t a中元素a都是函数,而类型b也是函数,这样子的话,此处a相当于于处理对象的middle ware,而b是具体的处理对象的函数,这样子讲可能比较抽象,让我们看下下面的例子...function($a, $stack){ return $stack($a . " 3 "); }, ]; //foldl...-> b),具体两个函数的实现可以去看下Laravel,原理就是第3节讲的。...总结 Pipeline可以方便我们应用一系列中间函数到要处理的对象,如果其中某一个中间处理函数失败,我们可以抛出异常,我们可以看到Laravel中好多地方都用到了Pipeline,是非常基础的功能。

    44820

    彻底搞懂感受野的含义与计算

    输入区域,在卷积神经网络中,feature map上某个元素的计算受输入图像上某个区域的影响,这个区域即该元素的感受野。...所以,感受野是个相对概念,某层feature map上的元素看到前面不同层上的区域范围是不同的,通常在不特殊指定的情况下,感受野指的是看到输入图像上的区域。...只有看到”合适范围的信息”才可能做出正确的判断,否则就可能“盲人摸象”或者“一览众山小”; 目标识别问题中,我们需要知道神经元看到是哪个区域,才能合理推断物体在哪以及判断是什么物体。...但是,网络架构多种多样,每层的参数配置也不尽相同,感受野具体该怎么计算? 约定 在正式计算之前,先对数学符号做如下约定, ? image.png ?...image.png 感受野大小 感受野大小的计算是个递推公式。 image.png 可视化如下图所示, ? image.png 感受野中心 image.png ? image.png ?

    3.8K21
    领券