我刚刚从typeclassopedia读了Monad和Applicative之间的区别。 我可以理解,没有join Applicative 。 但是下面的描述对我来说看起来含糊不清,而我无法弄清楚单子计算/行为的“结果”到底是什么意思。 所以,如果我把一个值写入Maybe ,这会产生一个monad,这个“计算”的结果是什么? 让我们仔细看看(>> =)的types。 基本的直觉是它将两个计算结合到一个更大的计算中。 第一个参数ma是第一个计算。 然而,如果第二个论点只是一个mb,那将是无聊的; 那么计算就不可能互相交互(实际上,这正是Applicative的情况)。 因此,(>> =)的第二个参数具有typesa – > mb:这种types的函数在给定第一个计算结果的情况下可以产生第二个要运行的计算。 …直观地说,正是这种能力使用以前的计算输出来决定接下来运行哪些计算,使得Monad比Applicative更强大。 应用计算的结构是固定的,而Monad计算的结构可以基于中间结果而改变。 是否有一个具体的例子说明“能够使用先前计算的输出来决定接下来要运行什么计算”,Applicative没有?
大多数Haskell教程都教导了如何使用IO标记。 我也从注释开始,但是这使得我的代码更像是一种命令式语言,而不是一种FP语言。 本周,我看到一个教程使用IO与<$> stringAnalyzer <$> readFile "testfile.txt" 而不是使用do main = do strFile <- readFile "testfile.txt" let analysisResult = stringAnalyzer strFile return analysisResult 日志分析工具没有do 。 所以我的问题是“ 我们是否应该避免使用符号? ”。 我知道也许会在某些情况下使代码更好。 另外, 为什么大多数教程都用IO来教IO呢? 在我看来, <$>和<*>使得代码比IO更多。
对于一个基本上不相关的问题, Cirdec的答案让我想知道如何用恒定的时间加法表示自然数,减去一个数,然后testing零。 为什么皮亚诺算术不够好: 假设我们使用 data Nat = Z | S Nat 那我们可以写 Z + n = n S m + n = S(m+n) 我们可以在O(1)时间内计算m+n ,通过放置mr借记(对于某个常量r ),每个S构造函数添加一个到n 。 为了得到O(1) isZero ,我们需要确保每S构造函数至多有p isZero ,对于一些常量p 。 如果我们计算a + (b + (c+…)) ,这个效果很好,但是如果我们计算((…+b)+c)+d ,它会分解。 麻烦的是,借方在前端堆积起来。 一个选项 简单的解决方法就是直接使用Okasaki描述的可链接列表。 有两个问题: O(n)空间不是很理想。 至less对我而言,并不是完全清楚的是,当我们不关心按照列表的方式排列时,引导队列的复杂性是必要的。
在看到List和Maybe monads是如何定义的之后,我自然而然地开始对IO monad的操作>>=和return是如何定义的。
我很好奇expressionflip id (这不是作业:我在getOpt文档中find它)。 我想知道为什么它有这种types: Prelude> :t (flip id) (flip id) :: b -> (b -> c) -> c 例如, (flip id) 5 (+6)给出11 。 我知道为什么id (+6) 5给了11,但是我不能“得到” flip id东西。 我试图用笔和纸自己弄清楚,但不能。 有人可以向我解释这个吗? 我的意思是, flip id如何具有typesb -> (b -> c) -> c ?
如果我说let 5 = 10 ,为什么5 + 1返回6而不是11 ?
我正在处理99个Haskell问题,并且看到了一个用于查找列表的最后一个元素的解决scheme: myLast = foldr1 (const id) const的types是a -> b -> a但const id是b -> a -> a 那么这里有什么魔力?
看到Void的types是无人居住的,它可以被看作是一个“构造函数”types吗? 或者,这只是一个快速的“黑客”,能够安全地忽略/禁用function,我看起来太深了?
我是Haskell和Yesod的新手,正在尝试构build一个简单的Web应用程序,可以从外部API回答查询。 我已经构build了一个parsing器(使用Parsec),这使得我想要加载一个实体的ID作为一个常规的Int值。 然而,我终身无法弄清楚如何把这个Int变成一个可以接受的东西(即一个Key (?))。 文档中的所有示例只能获得以前插入的id,或从url派发。 任何帮助将不胜感激,因为我似乎被卡住… 🙂
大多数教程似乎给了monads(IO,状态,列表等等)的很多例子,然后期望读者能够抽象出整体原理,然后他们提到类别理论。 我并不倾向于通过从例子中泛化来学习,我想从理论的angular度来理解为什么这个模式如此重要。 从这个线程判断: 任何人都可以解释Monads? 这是一个常见的问题,我已经尝试了大部分的教程(除了Brian Beckvideo,不会在我的Linux机器上播放): 有没有人知道从类别理论开始的教程,并解释IO,状态,列表monad这些条款? 以下是我不成功的尝试: 据我所知,一个monad包含一个三元组:一个内部函子和两个自然转换。 函子通常用types表示:(a – > b) – >(ma – > mb)为了强调对称性,我包含了第二个括号。 但是,这是一个pipe理者的终结,所以不应该像这样的域和共域吗? (a→b)→(a→b) 我认为答案是域和共域都有一个types: (a – > b)| (ma – > mb)| (mma – > mmb)等等… 但是我不确定这是否符合给定函子的定义? 当我们转向自然变革时,情况会变得更糟。 如果我理解正确的话,一个自然变换就是一个二次仿函数(具有一定的规则),它是一个仿函数的仿函数。 因此,由于我们已经定义了上面的函子,所以自然变换的一般types是:(a→b)→(ma→mb)→→(a→b)→ma→mb )) 但是我们正在使用的实际的自然转换有types: a – > ma ma – >(a – > mb) – > mb 上述一般forms的这些子集? 为什么他们是自然的转变? 马丁