Monad 最简介绍

如何理解 Free Monad? FP中有个比较拗口的monad  : Free 这里转自知乎的一个答案:   夏梓耀,理想主义码农,非战斗人员请迅速撤离 凉宫礼、Alex RENG、king zin 等人赞同 菜鸟来回答一下  Free最大的价值在于Monadic for-comprehension和Interpreter,前者只要描述算法,后者随意解释,可类比为接口和实现。 Free 可以 阅读详情

Monad 最简介绍

Haskell 是一门非常独特的编程语言,哪怕在函数语言中也很特立独行。它以彻底的纯函数和强大的类型系统闻名。Monad 就是由 Haskell 第一个引入编程世界的,它可算作目前为止编程中最难理解的概念了。几乎所有费心尽力最终理解了 Monad 的人都会有一种恍然顿悟的感觉,而且还忍不住会写一篇文章,跟大家分享他理解的 Monad 是什么,我也不例外。

1 为什么 Monad

Haskell 为什么会引入 Monad ? 最大的原因是为了在纯函数语言中引入副作用。

纯函数的优点是安全,可靠。函数输出完全取决于输入,不存在任何隐式依赖。它的存在如同数学公式般完美无缺。然而,越是完美的东西就越是没有用处,纯函数也一样。因为不能依赖外部环境,所以纯函数连基本的输入输出都做不了。一个简单的 Hello world 就能难倒纯函数。为了引入 IO 操作,各种函数语言八仙过海各显神通。而 Monad 就是 Haskell 语言给出的方案。更进一步,Monad 并不仅仅是 IO 操作的抽象,它更是多种类似操作之间共性的抽象。所以 Monad 解决的问题并不局限在 IO 上,像 Haskell 中的 Maybe 和 [] 都是 Monad。 Haskell 中漂亮的错误处理方式和灵活的列表推导式 (list comprehension) 也都算是 Monad 的贡献。

这里需要特别说明一下(因为我自己一直有这种误解),Monad 并非是引入 IO 的唯一方法,甚至,Monad 并没有把副作用引入纯函数中。纯函数不能有副作用,有副作用的不叫纯函数,哪怕用了神秘难解的 Monad 也不行。那么,Monad 到底做了什么呢?

让我们再回想一下: 纯函数安全可靠但无用,是个无趣的好男人; 普通函数能力强但 Bug 多,对程序来说却是必不可少的。如同危险而有魅力的坏男孩。如何同时拥有两者,让它们合作无间,各自发挥自身特点而不打架呢? 这就是 Monad 的作用了。它将带有副作用的 IO 操作以一种可控的方式引入到 Haskell 中,让纯函数与 IO 操作能够和平相处,共同组织出既安全又有用的程序。

2 Monad 的原理

函数之间要协作,就必须以各种形式交互连接。Haskell 采用了静态强类型系统,使得函数间的连接受限于入参与返回值类型,这大大增强了程序的安全性,同时也带了问题:如何既充分隔离纯函数与副作用函数,又能让两类函数相互复用?

我们拿 IO 操作做例子分析,Haskell 中专门有一个类型类(类似 C++ 中的 Concept 提案) “IO” 用来标示某类型是带有附加的外部 IO 动作。

为了充分隔离纯函数与 IO 函数,Haskell 中不能实现 IO Char -> Char 这样一种输入是 IO 类型返回值却是普通类型的函数。否则的话,副作用函数就可以通过这个函数来把 IO “拆箱” 从而变身为纯函数

Char -> Char = (Char-> IO Char) . (IO Char -> Char)

事实上,一旦参数中有 IO,返回值必有 IO,这就保证了充分隔离。

那如何让纯函数与 IO 函数相互复用呢?这就要靠 IO Monad 中定义的 return 和 >>= 这两个函数了。return (在 Haskell 中不是关键字,只是一般的函数名)的作用是将某个类型为 A 的值 a 以最自然的方式提升(或装箱)为类型为 IO A 的值: Char -> IO Char。所谓的“最自然”的方式是有严格定义的,后面会看到。有了这个函数后,纯函数就可以通过与 return 复合变成返回值为 IO 的带副作用的函数了,当然,实际的 IO 动作是 Haskell 语言内建的,return 的主要意义在于类型提升。
有了提升可没有下降操作,怎么复合 putChar :: Char -> IO() 与 getChar :: IO Char 呢。getChar 从 IO 读取一个字符,putChar 把字符写入 IO。但 getChar 返回的是 IO Char 类型,而 putChar 需要的是普通的 Char 类型,这两者不匹配,怎么办? 这就要靠 >>= 函数来连接这两个函数了。>>= 的类型是

IO a -> (a -> IO b) -> IO b

这样 >>= 就可以连接 getChar 与 putChar,把输入复写到输出中

echo = >>= getChar . putChar

可以看到,>>= 操作实际上是受限的类型下降(或拆箱)操作,只有当后面的函数返回值也是 IO 类型时才进行下降操作。这样就既充分隔离纯函数与副作用函数,又能让函数相互复用。

通过 return 和 >>= 两个平行”世界” (范畴) 就有了可控的通道。下面的图能直观的反映 Monad 的作用,A 与 IO A 是分属两个不同的世界,A 是纯洁类型,IO A 是带有外部 IO 操作的类型。为了保证整个程序的质量,两个世界的交流只能以图上的方式进行

  • return 是最自然的类型提升函数,将 a 提升为 a’
  • a -> b’ 是普通的提升函数
  • >>= 是受控的类型下降,只能在 b -> c’ 存在时,将 b’ 降到 b 以进行函数复合。这样 a -> b’ 与 b -> c’ 就能复合成 a -> c’ 了
  • Monad 没有定义 c -> c’,不存在这种不受控的下降方式

这里,IO 类型类可以是任意的符合 Monad 定义的类型类。a’ 可以是 IO a, Maybe a, 或者 [a]。同时 Haskell 的 do 语法糖又进一步简化了 >>= 复合的语法,使其成为很多类似问题的通用解决方案,这里就不展开了。

3 Monad 是什么

Monad 之所以难以理解,就在于它的抽象性。这不同于面向对象概念的抽象,鹰是一种鸟这种程度的类比就足以让人理解子类父类之间的继承关系了。Monad 的抽象是形而上的高度抽象。它本身是抽象代数中范畴学的一个概念,是特殊的算子。要真正消化它首先要理解抽象的对象,类型,范畴,函子这些概念,没有这些打底,理解 Monad 可谓是空中楼阁,无根之木。如果非要单独理解 Monad,那上图就是一个很好的简化形象说明。

前面说了,return 是最自然的提升方式,这里“最自然”是有明确意义的。指的是 return 和 >>= 函数必需满足下面的公理

  • return 与 >>= 互为逆操作
(return x) >>= f == f x
m >>= return == m
  • >>= 满足结合律
(m >>= f) >>= g == m >>= (\x -> (f x >>= g))

这些公理保证了 Monad 如预期正常工作。但可惜,它们在 Haskell 中没法用类型系统加以检查,可算是潜规则。正如动态语言需要大量测试覆盖代码保障质量一样,静态类型语言也需要外在的检验来保证这些潜规则没被违反。

Monad 被引入进 Haskell 用来解决 IO 操作可谓神来之笔,正如面象对象概念也可以在非面象对象语言中模拟一样,Monad 同样也能在其它中语言中实现 (比如 Java, C++, Python)。但只有在 Haskell 这种拥有强大类型系统的强类型语言中,Monad 概念才能发挥它的最大功效。Haskell 或没有进身为主流语言的一天,但相信 Monad 会象 Lambda 等概念一样,从函数语言的王谢家飞入寻常主流语言中来。

编程语言进步的三个阶梯是抽象,抽象,更高层次的抽象!


转载自 :道可道 | Monad 最简介绍 http://zhuoqiang.me/a/what-is-monad

Linux内核支持串口屏,linux串口触摸屏设计总结 Linux serial touch 设计总结概述:最近在做嵌入式linux下串口触摸屏设计,遇到一些问题,经过查找资料和请教同事,总算把问题解决了,事后有把linux相关的内核代码仔细看了一遍,为了有点成果,特别写了个总结。如有任何问题请联系yxj_5421@http://www.doczj.com/doc/87b94b1e227916888486d76d.html,转载请标明出处。系统资源:L... 阅读详情

相关推荐

基于紫光展锐平台的音频调用到hal层逻辑

基于紫光展锐平台的音频调用到hal层逻辑 1、数据流程图 AudioPolicyService和AudioFlinger的创建: 这两个服务都在audioserver中启动,文件路径: frameworks/av/media/audioserver/main_audioserver.cpp 从AudioFlinger和AudioPolicyService的创建,到output的打开,以及AudioFlinger开始往底层写入数据的具体流程如下图: #mermaid-svg-kjHL4XWwkQXN6NdA

weixin_55053963的博客 1355

通俗易懂讲解Monad的设计模式

一、函数编程Monad 函数式编程有一个重要概念,叫做Monad。 网上有很多解释(这里和这里),但都很抽象,不容易看懂。我尝试了好多次,还是不明白Monad到底是什么。 昨天,我读到了Aditya Bhargava的文章,他画了很多图。我想了半天,终于恍然大悟。下面,我就用这些图来解释Monad。 1. 软件最基本的数据,就是各种值(value)。 2. 处理值的一系列操作,可以封装成函数。输入一个值,会得到另一个值。上图的"(+3)"就是一个函数,对输入的值加上3,再输出。

qq_40262372的博客 2716

NVIDIA DGX Spark实战指南:从开箱到AI模型高效部署

本文详细介绍了NVIDIA DGX Spark的开箱体验、硬件架构及AI模型高效部署实战指南。从1 PetaFLOP算力的迷你设备到Grace Blackwell超级芯片的深度解析,再到五分钟快速上手指南和大模型部署技巧,帮助开发者充分利用这款全球最小AI超级计算机的性能优势。

weixin_29239279的博客 1363

理解Monad,一份monad的解惑指南

\本文要点:\\避免显式地处理状态值是有必要的\\t通过使用monad,你就可以移除代码中对状态值的明确处理。\\t一个monads类型必须与特殊的函数(名为“bind”)相联系\\t用了monad的bind函数后,状态值会从一个monad传递给下一个,而且始终在monad中(而非明确地在代码中被处理)\\t许多问题都可以用monad来解决\\\随着函数式编程的再次兴起,“monad” 这种函数式...

测试 1049

手把手教你用树莓派蓝牙抓取小米温湿度计2代数据,接入HomeAssistant(附密钥获取避坑指南)

本文详细介绍了如何通过树莓派蓝牙抓取小米温湿度计2代数据并接入HomeAssistant的完整流程。重点解析了获取32位加密密钥的三种方法,包括使用Telink Flasher工具、米家APP抓包和开源工具ATC_MiThermometer,并提供了HomeAssistant集成配置和常见问题排查指南,帮助用户实现稳定可靠的温湿度监测。

一名菜鸟攻城师 777

《IC验证必看|IC验证的全流程概览(从DUT到回归交付)》

本文系统介绍了IC验证的全流程,从理解设计需求到最终交付验证结果。主要内容包括:1)深入理解DUT的功能和接口;2)制定详细的测试计划(Testplan);3)搭建UVM验证平台;4)执行定向和随机测试并进行回归;5)分析功能、代码和断言覆盖率;6)交付完整的验证报告。文章强调验证是一个闭环过程,特别指出新手容易忽视测试计划和覆盖率分析这两个关键环节,导致验证不充分。文末还提出思考题,引导读者反思验证计划的制定方法。

m0_46663240的博客 1260

Monad详解

最近几年,函数式编程变得越来越流程,其代码简洁、副作用小、维护成本低等特点,使得许多其它的语言也开始支持函数式编程,比如Java 和 C#等。本文主要介绍一下函数式编程中的一个重要概念:Monad。      从定义上看,Monad就是两个接口:一个是return,另一个是一个bind;只要实...

chenhui3831的博客 563

RoCE Overlay

1. RoCE over vxlan 配置vxlan封装的RoCE流量,可以在PF switchdev模式下利用ovs bridge,或直接设置tc rules。下面将基于一对NIC互联的服务器介绍两种方式的使用,并分析封装后的数据包结构。 1.1. 基本配置 - VF与switchdev 首先创建VF,并为两个host设置PF的switchdev模式。使用ovs bridge或tc rules,...

sunshuying1010的博客 3058

Haskell学习笔记4 -- Monad

如果一个函数接收的是一个普通的值,然后返回一个盒子 怎么将这个函数应用在一个盒子上,并得到一个单独的盒子呢? (>>=) :: Monad m => m a -> (a -> m b) -> m b >>=先接收一个装有值的盒子 (f a),然后是一个特殊的接受值返回盒子的函数 ((a -> f b)) 最后返回一个盒子 (f b) Just 1 >>= \x -> Just (x+3) 先将盒子中的值 1 取出来,然后传入

weixin_54634208的博客 403

AMD机密计算虚拟机介绍

AMD机密计算虚拟机介绍

木简熙的博客 524

TRAE智能体开发:TRAE概述

TRAE(/treɪ/)深度融合 AI 能力,是一名能够理解需求、调用工具并独立完成各类开发任务的“AI 开发工程师”,帮助你高效推进每一个项目。

王国平的博客 1254

Haskell 的 Monad

Functor 定义 定义如下: class Functor f where fmap :: (a ->b) -> f a -> f b 其中,fmap 需要遵守以下两个约束: -- Identity fmap id == id -- Composition fmap (f . g) == fmap f . fmap g 注:<$> 就是 fmap ​ 相关的例子 Maybe 是如何实现 Functor 的: instance Functor Maybe where

charvl的博客 534

YOLO26 无损剪枝:稀疏训练 + 结构化通道裁剪

YOLO26 无损剪枝链路:YOLO26s (7.2M) → 稀疏训练 30 epoch (L1 on BN gamma, lam=0.01) → 阈值剪枝 50% (gamma<quantile(0.5)) → 结构化重建 Conv+BN → 微调 10 epoch (lr=1e-4) → YOLO26n (1.9M, mAP50 0.808, 仅降 0.6%)。核心贡献:稀疏训练让 BN gamma 趋向二元分布 (近 0 或近 1), 剪枝阈值可直接取 median 自动 50% 压缩。

m0_64661770的博客 263

Kotlin Monad的学习

文章目录0. 前言1. 概述1.1 起源1.2 Monad 可以看成一种设计思想1.3 数学概念1.3 Monad 的模板代码2. arrow-kt 中的代码实例总结参考 0. 前言 在学习函数式编程时,函子(Funtor)、单子(Monad) 是非常难啃的骨头,它们来自于数学范畴论,又只在 Haskell 这种满是学术气息的语言上发展,本来阅读了几篇 Kotlin 上介绍该概念的文章,但是感觉吸收不够好,所以写这篇文章来学习和记录。 此外,FP Kotlin 框架 arrow-kt 里面已经具象了这个概

RikkaTheWorld 3981

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

Haskell 状态Monad (State Monad)的理解

1、State s a数据类型 State s a是一种用来封装状态处理函数(又叫:状态处理器):\s -> (a,s’)的数据结构,因为State封装的是一个状态处理器(state processor)而不是状态s本身,所以称State为State类型(type)是不准确的。 newtype State s a = State { runState :: s -> (a,s) } -...

天涯爱生活 2817

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

探索Kotlin中的Monad世界:kotlin-monads项目介绍

探索Kotlin中的Monad世界:kotlin-monads项目介绍 在现代编程语言中,Kotlin以其简洁、安全和互操作性著称,而Monad作为一种强大的抽象概念,为函数式编程提供了强大的工具。今天,我们将深入探讨一个令人兴奋的开源项目——kotlin-monads,它试图在Kotlin中实现Monad,深受Haskell Monad的启发,同时受限于Kotlin的类型系统。 项目介绍 kot...

gitblog_00767的博客 1091

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Monad你我他

初识函数式编程的时候,Monad这个词就一直萦绕在我的耳边眼前和脑海中。这个在1991年由Eugenio Moggi从Category理论引进而来的概念,如同函数式编程中的许多其他概念一样有着深厚的数学背景。也许正是如此,Monad对于习惯了用传统命令式编程语言思考的人们可谓是一个难以理解的Monster。然而这个概念在越来越多的地方不断地出现,Haskell语言的官方站点上有一个关于Monad教

O.Nixie的专栏 1962

什么是免费monad?

I've seen the term Free Monad pop up every now and then for some time, but everyone just seems to u

xfxf996的博客 472

Java中的Monad设计模式及其实现

在函数式编程中,Monad是一种重要的设计模式,用于处理包含隐含计算信息(如计算顺序、环境、状态、错误处理等)的计算。Monad提供了一种结构,使得可以将计算链式连接起来,每一步计算可以显式地传递和处理这些隐含的信息。尽管Java不是一个原生支持函数式编程的语言,但我们可以通过合理的设计来模拟和实现Monad设计模式。

微笑听雨 2606

学习笔记十六——Rust Monad从头学

如果一个东西(比如 Option、Result、Future)能做到包值 + 链操作 + 保持上下文结构不变,它就是一个 Monad。就像数学里的“加法结合律”,Monad 定律是确保你写的链式操作是稳定的、不会因为写法不同导致逻辑出错。类型类型构造器unitbind(链接)OptionSome(x)ResultOk(x)Futureasync{}

pumpkin84514的博客 1747

Scala自定义Monad实战:从理论到应用的完整指南

1. 引言:为什么需要自定义Monad?2. Monad的本质回顾2.1 Monad的数学定义2.2 Monad三大定律2.3 Monad的核心思想3. 自定义Monad的基础实现3.1 最简单的Monad:Identity Monad3.2 带日志的Monad:Writer Monad3.3 带状态的Monad:State Monad4. 实际应用场景一:工作流引擎4.1 业务流程工作流Monad4.2 工作流执行流程5. 实际应用场景二:交易处理系统5.1 金融交易Monad。

✨ 欢迎来到【Seal ^_^ 的优快云博客】!✨ 2182

Haskell的monad和范畴论的探讨

下面是上次和我一起讨论haskell的网友的继续,主要探讨了haskell的monad和范畴论的关系。 2012年3月28日: Parker says: (10:45:06 PM) haskell你现在有看新的东西吗 gbx says: (10:45:28 PM) 没有啊, 好久没看了 Parker says: (10:45:50 PM) 我现在看范畴论的

会飞的鱼的专栏 1万+

haskell monad

Monad 是一个从 Applicative functors 很自然的一个演进结果。对于他们我们主要考量的点是:如果你有一个具有 context 的值 m a,你能如何把他丢进一个只接受普通值 a 的函数中,并回传一个具有 context 的值?也就是说,你如何套用一个型态为 a -> m b 的函数至 m a?基本上,我们要求的函数是: (>>=) :: (Monad m) => m

u013015430的专栏 765
上一篇: 3天学习haskell---haskell第三天
下一篇: 函數副作用-纯函数
crazyhacking
博客等级 码龄15年 299粉丝 148原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值