ant
ant
因为您的书,使用了相当通俗而且可视化的方式来描述单子,所以有些困惑需要您的帮助才能更好的理解。我很喜欢您的这本书。 下面也是一篇讲monad与副作用的。 http://zhuoqiang.me/what-is-monad.html 在接触了monad,接触了纯函数,副作用后,有点似懂非懂,需要有一个东西,一个指导性的设计过程,在这个过程中,把这几个概念全部串起来,体现出这些东西来。 就好像上面的例子一样,打印玩家信息,变成了一个纯函数,把需要打印出来的玩家信息,封装在了一个io接口里,但是并不运行。 这就好像是redux-saga中yield call (action,paras),一样,call只是一个描述,描述有一个action要做,有什么参数,但是怎么做,则交给redux-saga的框架来完成。从而使得generator的内容可以被测试。 虽然我已经有点儿明白了,但此时也只是看到一个不纯的函数,是如何变成一个纯函数,可是最后一步的输出,在哪里?也没有看到单子在哪里?
monid{ S: Maybe, Maybe[maybe], Maybe[Maybe[Maybe]]等等元素, 二元运算符:flat 幺元:return } 谁修正,说明一下?
对于单子上的(S,M,1)来讲 * -> * 映射 函数,构成S集合元素, . 是函数之间的复合运算符,两个入参都是函数,输出也是函数 return 也是S集合上的一个元素,这个函数是单位元 这样理解是否正确?
我先简单的理解和问一下: Monad下的半幺群, 1、其二元运算符是 ( ∘ ) 也即是针对函数的复合运算 2、其运算对象是 *->* 的函数 3、pure id 就是这个复合运算符的单位元?好像不对,可能是return 函数,return函数是单位元 如果正确,我再往下慢慢啃:)
幺半群Monad并不是针对*的类型而言的,而是针对类别为* -> *的自函子而言的,他的操作对象是Maybe、[]这样的自函子....... 1.其中,* -> *,不就是函数的形式吗?表示需要一个入参,才能确定值的吗? 而* -> * 与 任意其它的* -> *进行运算,不就是函数之间的复合? 2.感觉不对呀。 join :: Monad m => m (m a) -> m a 这是join的声明,这个声明,只有一个输入参数呀,即入参数为:m (m a) 输出是m a,从这里来看,根本就是一个...
好吧。 假定join就是一个二元运算符,需要t1,t2两个参数。 如果向join提供了t1,于是join柯里化了,还需要一个参数才能被应用。 当t1是“类别 * -> *,也是需要先提供前一个 *,才能得到下一个*, 于是t2就由t1这个类别来提供了? 先留个问号吧? 关于类型与类别?确实对这两个概念之间的意图和区别有了解,书上第31章 高级类型编程,有提到, 但过于简略。能否请您在此开辟一节,提提这两个概念的区别和缘由。 因为该书从头看下去,一直看到的是类型,并且在GHCI中可以使用:t x 来测试 , 还有一个:k x的测试类别。
以Maybe自函子为例 monid{ S: Maybe, Maybe[maybe], Maybe[Maybe[Maybe]]等等元素,这些元素,才是join的参数? 二元运算符:join 幺元:return }
很奇妙!清楚了一点。 [1..2]
[],Maybe作为Functor,Applicative,Monad,的实例,应该也有自己的实现。源代码怎么看?
magic-haskell ,P136页, ( a -> f b -> fa () ::Functor f => f a -> b -> f b ($>) = flip (