论坛首页 综合技术论坛

对 T1 关于Category Theory 和Monad 一文的理解

浏览 4171 次
精华帖 (0) :: 良好帖 (1) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2008-12-31   最后修改:2008-12-31
FP
原文见 http://www.iteye.com/topic/147443?page=1,没赶上讨论。今天看到有 http://wfp.group.iteye.com/group/topic/4639一文,谈论 monad,搜到 T1 发的这篇文,略有心得,提出来请大家帮忙指正一下。

抱歉的是,对近世数学不熟,能把这篇文看下去的动力是哲学。幺半群等等概念和符号又符号的东西看了本文才有点模糊的概念。

文中首先介绍了两个概念,一是范畴,这大概包括集合和集合内元素的运算,二是两个范畴之间的同构和实现同构的映射。

文中所举的例子工资的例子很经典。

大概理解为,范畴如自然数,集合为 0,1,2,3....
支持 + - * / 等操作

范畴如美元工资(美元计算的工资),集合为 $0, $1, $2, ...
支持 + - 操作。 * / 操作似乎是美元工资和自然数两个范畴之间的操作,当否。

现在,自然数的 + 操作已经实现,假如 + 操作异常复杂,需要 1w 行代码或者 1w 张稿纸演算。在美元工资范畴要实现 + 法,也要同样的代价。幸运的是,我们发现这两个范畴的加法是同构的,因此,只要提供一个映射函数,将工资范畴的 $0 脱去$ 变成自然数范畴的元素 0(一个自然数),就可以把自然数的 + 延展到于美元工资范畴。因此,需要两个映射:

去$ : 自然数 -> 美元工资的映射
加$ : 美元工资 -> 自然数的映射

有了这两个映射,美元工资范畴的加法就可以定义为:

范畴 美元工资{
  操作 + (a, b){
      加$(自然数::+ (去$(a), 去$(b)))
  }
}


如上,常常需要将这个范畴的东西转到另外一个范畴,然后在另外一个范畴演算,再转换回原来的范畴,或者转换到另外第三个范畴。monad 的主要工作就是干这个用。

先不谈 IO、continuous 等问题。不知道这个理解有没有问题。
   发表时间:2009-07-27  
这么一想大概是这个意思
0 请登录后投票
   发表时间:2009-08-18  
这个解释起来比较容易理解了,开始我也看不明白monad的意思。
0 请登录后投票
   发表时间:2009-10-13  
hurd 写道
这个解释起来比较容易理解了,开始我也看不明白monad的意思。


理解倒是好理解了,今天又找了几篇文,如

http://hi.baidu.com/starwing/blog/item/9b0f78f4f938fdd1f2d3859e.html

还有好几篇,说的意思也近似。


但还是有个问题没搞懂,究竟 IO 是不是脏操作? SICP 给了一个思路,将状态理解为在时间中不断延展的磁带,也就是一个不断延展的列表来理解输入。不管怎么绕 readLine(),每次的返回结果都不同,这是回避不了的。 貌似 monad 也只是将脏操作的范围框起来,控制了它的活动范围而已。该悲观的猜测是否正确,请教高人。

btw. 如果 io 能说通,a = a + 1 在 pure function 也可以绕出来对吧
0 请登录后投票
   发表时间:2009-10-14  
如果把 readLine 改写为 readLine(now(), machine id),剩下的问题就是 now() 函数为何每次都不同了
0 请登录后投票
   发表时间:2009-10-20  
IO函数当然是非纯函数。其实按照函数式的定义,IO是操作,不能叫函数的。包装成函数了就只能当非纯函数了。
不错。readline确实有个默认的参数是now(),所以readline被包装成函数之后传进它的参数不可能是一样的(“不可能踏入同一条河”)。也就是readline永远没有证明自己纯函数身份的可能。now()函数每次不同是因为设计now()读取now()要的就是那个不同,是时间(确切地说是机器的晶震)在负责给他range着的值。readline的now()参数真正一样的时候,比如两台机器同时在工作同时在读取,那machine id也一样,而且machine id那台机器正在广播,那readline的返回值就一样了。但这之前有时钟同步的问题,T1讲过,我还是不清楚。
你说的这个“脏”,我说的这个“非纯函数”,说的其实是往一个函数传进readline时, 每次传进去的明明都是readline,貌似传进去一样的参,其实是不能保证一样的。
0 请登录后投票
论坛首页 综合技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics