对 haskell 与 monad 的理解
http://www.opengpu.org/bbs/viewthread.php?tid=2638&extra=page%3D1
haskell作为纯函数式语言如何处理IO
并不是真正的处理,只是通过类型系统将跟IO相关的“不纯”的代码和其他纯函数式代码隔离开。通过编译期类型检查进行保证。
具体实现就是通过叫 IO 的 type constructor [io] ,而这个 IO 就是 Monad 的一种。
Monad是什么
在数学上Monad是一门处理状态转换的数学理论。
对于haskell来说,Monad 就是一个 type class [monad] ,这个 type class 定义了一组接口,前面说的 IO 就是实现了这组接口的实例。
- class Monad m where
- (>>=) :: forall a b. m a -> (a -> m b) -> m b
- (>>) :: forall a b. m a -> m b -> m b
- return :: a -> m a
- fail :: String -> m a
复制代码
. 这些接口目的何在
- foo,bar :: String->IO String
- foo msg = return ("foo "++msg)
- bar msg = return ("bar "++msg)
- main = do
- foo "world"
- name <- getLine
- bar name
复制代码
上面的do语法糖扩展出来实际上是下面这样:
- foo "world" >>=
- (\_ ->
- getLine >>=
- (\name ->
- bar name)))
复制代码
这些接口的目的就在于保证操作的顺序执行,也就是说实现了这些接口的类型,使用do语法就可以编写顺序执行的语句了。
haskell 的 IO 类型就是利用这点保证IO操作的顺序执行,并通过类型系统将涉及IO和不涉及IO操作的函数清晰地区别开来。
[io] [url=http://www.haskell.org/ghc/docs/ ... base/System-IO.html]http://www.haskell.org/ghc/docs/ ... base/System-IO.html[/url]
[monad] http://www.haskell.org/ghc/docs/ ... /Control-Monad.html
from : http://www.yi-programmer.com/blo ... kell_and_monad.html
|
<script src="tag.php?action=relatetag&rtid=2638" type="text/javascript"></script>
分享到:
相关推荐
三文鱼Common Lisp中monad的可... 在Haskell中,monad理解如下: do a <- [ 1 , 2 , 3 ] let c = 5 b <- [ 4 , 5 ] return (a + b + c) 在鲑鱼中表达相同的模式(mdo (a '( 1 2 3 )) ( let (c 5 )) (b '( 4 5 ))
Haskell-dmmf Wlashin的Haskell实现 ... 对智能构造函数使用应用验证,而不是Result (F#)/ Either (Haskell)monad 设置 只需确保您拥有一个相当不错的现代版本的并且您应该能够运行: $ stack build
Monad的挑战 该项目的目的是为单人动手实践探索... 要重新生成HTML,请转到monad-challenges-code/hakyll目录并运行./regen.sh 。 如果您想做出贡献,但不知道该怎么做,请查看,看看您是否可以在此方面提供任何帮助。
方法命名遵循 Haskell 约定,因此 gem 可用于尝试理解 monad(主要在使用 Haskell 的教程中描述)。 用法 有关如何使用这些 monad 的,请查看目录。 贡献 分叉它( ) 创建您的功能分支( git checkout -b my-new-...
本文旨在作为第10章的理解帮助,对于我和陷入其中的Haskell初学者而言。 第10章以解析文件为例。 此回购中包含此古老但简单格式的样本文件test.pgm 。 如果在文本编辑器中打开此文件,将看到以下内容: P5 640 ...
方法命名遵循 Haskell 约定,因此 gem 可用于尝试理解 monad(主要在使用 Haskell 的教程中描述)。 单子实现: 身份(用于教育目的) 也许 列表 延续 同时 安装 将此行添加到应用程序的 Gemfile 中: gem '...
戴森Daison(数据理解)是一种创建数据库的实验,该数据库本机存储Haskell数据类型,而不使用传统SQL表。 后端存储是SQLite,我从中删除了所有与SQL相关的功能。 结果是简单的键值存储。 最重要的是,有一个Haskell ...
转到查找有关在 Windows 上编译 haskell 程序的说明。 编译需要安装 。 要编译,请使用命令ghc --make Main.hs 。 如果 GHC 抱怨 Control.Monad.Error 的歧义,则使用命令ghc --make -hide-package monads-fd Main....
该存储库包含在“编程语言原理(2015)”课程的练习讲座中提供的所有有关 Haskell 的练习 (6/5/15) 函数定义和模式匹配; 构造函数(类型与数据); 记录语法; 类型同义词; 新类型与数据; 函数柯里化和组合; ...
当然如果您对这些虚头八脑的名词不感兴趣,那么,你尽可以跳过这一章,不知道什么是“函数式”,并不会影响你对这个库的理解的。 C++这几年随着gp的普及,“函数式”这个老孔乙己逐渐又被人从角落里面拽了出来。一...
Morph是Haskell式态射影的一个库:monoid,函子和monad。 这些构造有助于设计纯粹功能的程序,并封装许多编程技术所采用的样板。 特征 基于协议和数据类型的实现。 预定义的monoid和函子; 支持Clojure集合。 ...
包含了一切:类型家族、数据种类、更高级别的 monad 转换器、对unsafePerformIO和unsafeCoerce优雅使用,甚至是对 comonad 的无偿使用。 它只有 255 行代码,是展示这些更高级 Haskell 功能用途的一种紧凑方式,但...
Rust mdo演示Rust mdo是使用宏和鸭子键入的单子符号。 它提供了一个语法扩展,提供了看起来很像的东西。Rust mdo演示Rust mdo是一种使用宏和鸭子...fn main(){//为迭代器monad导出monadic函数(类似于//列表理解)
选择自由 Monad 的数据代数构造使其紧密对齐以join ,选择自由应用函子的数据代数构造使其与上下文应用程序( <*>又名 ⊛ 又名ap )紧密对齐. 但是这些自由应用函子的构造是必要的吗? 它们是否使 Free Monad ...