`

(转)对 haskell 与 monad 的理解

阅读更多

对 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 就是实现了这组接口的实例。
  1. class Monad m where
  2.     (>>=) :: forall a b. m a -> (a -> m b) -> m b
  3.     (>>) :: forall a b. m a -> m b -> m b
  4.     return :: a -> m a
  5.     fail :: String -> m a
复制代码



.
这些接口目的何在
  1. foo,bar :: String->IO String
  2. foo msg = return ("foo "++msg)
  3. bar msg = return ("bar "++msg)

  4. main = do
  5.     foo "world"
  6.     name <- getLine
  7.     bar name
复制代码
上面的do语法糖扩展出来实际上是下面这样:
  1. foo "world" >>=
  2.   (\_ ->
  3.     getLine >>=
  4.       (\name ->
  5.         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&amp;rtid=2638" type="text/javascript"></script>

分享到:
评论

相关推荐

    salmon:普通Lisp的Monad

    三文鱼Common Lisp中monad的可... 在Haskell中,monad理解如下: do a &lt;- [ 1 , 2 , 3 ] let c = 5 b &lt;- [ 4 , 5 ] return (a + b + c) 在鲑鱼中表达相同的模式(mdo (a '( 1 2 3 )) ( let (c 5 )) (b '( 4 5 ))

    haskell-dmmf:Wlashin的域建模的Haskell实现使功能正常

    Haskell-dmmf Wlashin的Haskell实现 ... 对智能构造函数使用应用验证,而不是Result (F#)/ Either (Haskell)monad 设置 只需确保您拥有一个相当不错的现代版本的并且您应该能够运行: $ stack build

    monad-challenges:跳起对单子的理解的一系列挑战

    Monad的挑战 该项目的目的是为单人动手实践探索... 要重新生成HTML,请转到monad-challenges-code/hakyll目录并运行./regen.sh 。 如果您想做出贡献,但不知道该怎么做,请查看,看看您是否可以在此方面提供任何帮助。

    monadist-php:几个流行的 monad 的 PHP 实现

    方法命名遵循 Haskell 约定,因此 gem 可用于尝试理解 monad(主要在使用 Haskell 的教程中描述)。 用法 有关如何使用这些 monad 的,请查看目录。 贡献 分叉它( ) 创建您的功能分支( git checkout -b my-new-...

    real-world-haskell-chapter-10:真实世界Haskell第10章演练

    本文旨在作为第10章的理解帮助,对于我和陷入其中的Haskell初学者而言。 第10章以解析文件为例。 此回购中包含此古老但简单格式的样本文件test.pgm 。 如果在文本编辑器中打开此文件,将看到以下内容: P5 640 ...

    monadist:几个流行的 monad 的实际实现

    方法命名遵循 Haskell 约定,因此 gem 可用于尝试理解 monad(主要在使用 Haskell 的教程中描述)。 单子实现: 身份(用于教育目的) 也许 列表 延续 同时 安装 将此行添加到应用程序的 Gemfile 中: gem '...

    daison:Haskell中的NoSQL数据库

    戴森Daison(数据理解)是一种创建数据库的实验,该数据库本机存储Haskell数据类型,而不使用传统SQL表。 后端存储是SQLite,我从中删除了所有与SQL相关的功能。 结果是简单的键值存储。 最重要的是,有一个Haskell ...

    gst-hs:带有简单 REPL 的 godel 系统 T 解释器

    转到查找有关在 Windows 上编译 haskell 程序的说明。 编译需要安装 。 要编译,请使用命令ghc --make Main.hs 。 如果 GHC 抱怨 Control.Monad.Error 的歧义,则使用命令ghc --make -hide-package monads-fd Main....

    PL2015:编程语言原理课程执行讲座的存储库(2015)

    该存储库包含在“编程语言原理(2015)”课程的练习讲座中提供的所有有关 Haskell 的练习 (6/5/15) 函数定义和模式匹配; 构造函数(类型与数据); 记录语法; 类型同义词; 新类型与数据; 函数柯里化和组合; ...

    javaparser:基于函数式组合子逻辑的JAVA语言分析框架

    当然如果您对这些虚头八脑的名词不感兴趣,那么,你尽可以跳过这一章,不知道什么是“函数式”,并不会影响你对这个库的理解的。 C++这几年随着gp的普及,“函数式”这个老孔乙己逐渐又被人从角落里面拽了出来。一...

    morph:形态学图书馆

    Morph是Haskell式态射影的一个库:monoid,函子和monad。 这些构造有助于设计纯粹功能的程序,并封装许多编程技术所采用的样板。 特征 基于协议和数据类型的实现。 预定义的monoid和函子; 支持Clojure集合。 ...

    strongly-typed-bound:我的 Kmett 版本的“acowley 的强类型绑定”片段

    包含了一切:类型家族、数据种类、更高级别的 monad 转换器、对unsafePerformIO和unsafeCoerce优雅使用,甚至是对 comonad 的无偿使用。 它只有 255 行代码,是展示这些更高级 Haskell 功能用途的一种紧凑方式,但...

    mdo-使用宏和鸭子输入法对Monadic进行除锈的符号-Rust开发

    Rust mdo演示Rust mdo是使用宏和鸭子键入的单子符号。 它提供了一个语法扩展,提供了看起来很像的东西。Rust mdo演示Rust mdo是一种使用宏和鸭子...fn main(){//为迭代器monad导出monadic函数(类似于//列表理解)

    free-applicative:只是一个快速实现经典自由代数的应用程序

    选择自由 Monad 的数据代数构造使其紧密对齐以join ,选择自由应用函子的数据代数构造使其与上下文应用程序( &lt;*&gt;又名 ⊛ 又名ap )紧密对齐. 但是这些自由应用函子的构造是必要的吗? 它们是否使 Free Monad ...

Global site tag (gtag.js) - Google Analytics