Questions tagged «monads»

编程中的monad是可组合的计算描述。Monad是功能编程语言(例如Haskell)中的重要构造。

5
什么是索引单子?
什么是索引式monad以及此monad的动机? 我已经读过它有助于跟踪副作用。但是类型签名和文档并没有带我到任何地方。 它将如何帮助跟踪副作用(或任何其他有效的例子)的例子是什么?
98 haskell  monads 

3
如何在Haskell中玩Control.Monad.Writer?
我是函数编程的新手,并且最近在Learn Has a Haskell中学习,但是当我读完本章时,我陷入了以下程序: import Control.Monad.Writer logNumber :: Int -> Writer [String] Int logNumber x = Writer (x, ["Got number: " ++ show x]) multWithLog :: Writer [String] Int multWithLog = do a <- logNumber 3 b <- logNumber 5 return (a*b) 我将这些行保存在.hs文件中,但未能将其导入到我的ghci中,抱怨如下: more1.hs:4:15: Not in scope: data constructor `Writer' …
96 haskell  monads 

3
mtl,transformers,monads-fd,monadLib和选择的悖论
黑客有几个用于monad变压器的软件包: mtl:Monad变压器库 变压器:混凝土函子和单子变压器 monads-fd:Monad类,使用函数依赖项 monads-tf:Monad类,使用类型族 monadLib:monad变压器的集合。 mtl-tf:使用类型族的Monad转换器库。 mmtl:模块化Monad变压器库 mtlx:具有类型索引的Monad转换器库,提供“免费”副本。 compose-trans:可组合的monad变压器 (也许我错过了一些) 我们应该使用哪一个? mtl是Haskell平台中的mtl,但我一直在reddit上听到它很不酷的消息。 但是无论如何,选择有什么不好,这不是一件好事吗? 好吧,我看到例如数据访问器的作者必须如何做出所有这些选择以迎合流行的选择: data-accessor-monadLib库:monadLib的monad的访问器函数 data-accessor-monads-fd库:使用访问器访问monads-fd State monad类中的状态 data-accessor-monads-tf库:使用访问器访问monads-tf State monad类型族中的状态 data-accessor-mtl库:使用访问器访问mtl State monad类中的状态 data-accessor-transformers库:使用Accessor来访问变形金刚状态monad中的状态 我想如果继续进行下去,例如几个竞争的Arrow软件包不断发展,我们可能会看到类似的东西:spoonklink-arrows-transformers,spoonklink-arrows-monadLib,spoonklink-tfArrows-transformers,spoonklink-tfArrows-monadLib,... 然后,我担心如果spoonklink被派生了,黑客程序将耗尽磁盘空间。:) 问题: 为什么会有这么多的monad变压器套件? 为什么[考虑]不酷? 主要区别是什么? 这些看似竞争的软件包中的大多数由Andy Gill编写,由Ross Paterson维护。这是否意味着这些软件包没有竞争,而是以某种方式协同工作?Andy和Ross是否认为自己的任何软件包都已过时? 您和我应该使用哪一个?

3
状态,ST,IORef和MVar之间的区别
我正在48小时内完成“ 编写自己的计划”(我大约需要85小时),并且已经完成了有关添加变量和赋值的部分。本章在概念上有很大的跳跃,我希望它分两步完成,并且在两者之间进行了很好的重构,而不是直接跳转到最终解决方案。无论如何… 我迷路了一些不同类的,似乎达到相同的目的:State,ST,IORef,和MVar。文本中提到了前三个,而后三个似乎是很多有关前三个的StackOverflow问题的首选答案。它们似乎在连续调用之间都带有状态。 这些分别是什么,它们又有何不同? 这些句子尤其没有意义: 相反,我们使用一种称为状态线程的功能,让Haskell为我们管理聚合状态。这使我们能够像使用任何其他编程语言一样对待可变变量,使用函数来获取或设置变量。 和 IORef模块使您可以在IO monad中使用状态变量。 所有这些使这条线变得type ENV = IORef [(String, IORef LispVal)]混乱-为什么第二条IORef呢?如果我改写会type ENV = State [(String, LispVal)]怎样?

5
与对FlatMap / Map转换的理解相混淆
我真的似乎不太了解Map和FlatMap。我无法理解的是理解力是对map和flatMap的一系列嵌套调用的序列。以下示例来自Scala中的Functional Programming def bothMatch(pat:String,pat2:String,s:String):Option[Boolean] = for { f <- mkMatcher(pat) g <- mkMatcher(pat2) } yield f(s) && g(s) 转换为 def bothMatch(pat:String,pat2:String,s:String):Option[Boolean] = mkMatcher(pat) flatMap (f => mkMatcher(pat2) map (g => f(s) && g(s))) mkMatcher方法的定义如下: def mkMatcher(pat:String):Option[String => Boolean] = pattern(pat) map (p => (s:String) => p.matcher(s).matches) 图案方法如下: import java.util.regex._ def …

18
Option [T]类有什么意义?
我无法理解Option[T]Scala的课程重点。我的意思是,我不能看到任何advanagesNone了null。 例如,考虑以下代码: object Main{ class Person(name: String, var age: int){ def display = println(name+" "+age) } def getPerson1: Person = { // returns a Person instance or null } def getPerson2: Option[Person] = { // returns either Some[Person] or None } def main(argv: Array[String]): Unit = { val p = …

5
一个具体的例子表明单子在组合下没有关闭(有证据)?
众所周知,应用函子根据组成是封闭的,但单子函数不是。但是,我一直在寻找一个具体的反例来说明单子并不总是构成的麻烦。 这个答案给出[String -> a]了一个非单子的例子。在玩了一段时间之后,我凭直觉相信了它,但是这个答案只是说“无法实现连接”而没有给出任何理由。我想要更正式的东西。当然有很多类型的函数[String -> [String -> a]] -> [String -> a]; 必须证明任何此类功能不一定满足单子法则。 任何示例(附带证明)都可以;我不一定要特别寻找上述示例的证明。

1
“ Monad变形金刚比效果更强大”-例如?
Edwin C. Brady关于Idris中的影响的论文“具有代数效应和相关类型的编程和推理”包含(未引用的)主张: 尽管[效果和monad变压器]的功率不相等-monads和monad变压器可以表达更多概念,但可以捕获许多常见的有效计算。 有哪些可以用monad变压器建模但不能用效果建模的示例?

5
Monads作为附件
我一直在阅读类别理论中的单子。对monad的一个定义是使用一对伴随函子。一个单子通过使用这些函子的往返来定义。显然,附加语在范畴论中非常重要,但是我还没有看到关于伴随函子对Haskell monads的任何解释。有没有人想过?

9
Java 8单声道
为了帮助理解monad是什么,有人可以使用Java提供示例吗?有可能吗? 如果您从此处http://jdk8.java.net/lambda/下载预发行版本的兼容lambda的JDK8,则可以使用Java使用Lambda表达式。 下面显示了使用此JDK的lambda示例,有人可以提供相对简单的monad吗? public interface TransformService { int[] transform(List<Integer> inputs); } public static void main(String ars[]) { TransformService transformService = (inputs) -> { int[] ints = new int[inputs.size()]; int i = 0; for (Integer element : inputs) { ints[i] = element; } return ints; }; List<Integer> inputs = new ArrayList<Integer>(5) …
78 java  java-8  monads  optional 

5
Haskell Cont monad如何以及为何起作用?
这是Cont monad的定义方式: newtype Cont r a = Cont { runCont :: (a -> r) -> r } instance Monad (Cont r) where return a = Cont ($ a) m >>= k = Cont $ \c -> runCont m $ \a -> runCont (k a) c 您能解释一下它如何运作以及为什么起作用吗?到底在做什么

2
ST monad如何工作?
我知道ST monad有点像IO的小弟弟,而IO则是带有附加RealWorld魔术的状态monad 。我能想象的状态,我能想象的是现实世界被莫名其妙地投入IO,但每次我写的类型签名ST中s的ST单子让我困惑的。 例如,ST s (STArray s a b)。s那里的工作如何?它是否只是用来在计算之间建立一些人为的数据依赖性,而不能像状态monad中的状态那样引用(由于forall)? 我只是抛出一些想法,并且非常感谢比我有更多知识的人向我解释。
77 haskell  monads 

2
单子vs箭
我对函数式编程中使用的monad和箭头的概念非常熟悉。我也了解它们可以用来解决类似的问题。 但是,对于在任何给定情况下如何选择要使用的选项,我仍然有些困惑。 什么时候应该使用monad,什么时候应该使用箭头?

7
具有Join()而不是Bind()的单子
Monad通常以return和交替解释bind。但是,我认为您也可以bind根据join(和fmap?)实现 在缺乏一流功能的编程语言中bind,使用起来非常尴尬。join另一方面,看起来很简单。 但是,我不确定我是否了解join工作原理。显然,它具有[Haskell]类型 加入:: Monad m => m(mx)-> mx 对于清单monad来说,这显然是微不足道的concat。但是对于一般的monad而言,此方法实际上在做什么?我看到了它对类型签名的作用,但是我试图弄清楚如何用Java或类似语言编写类似的内容。 (实际上,这很容易:我不会。因为泛型已损坏。;-)但从原理上讲,问题仍然存在...) 哎呀。似乎以前有人问过这个问题: Monad加入功能 可能有人勾画出使用普通的单子一些实现return,fmap和join?(也就是说,一点也不提>>=。)我认为这也许可以帮助它沉入我的愚蠢大脑中……
69 haskell  monads 

6
暂停单子
Monad可以完成许多令人惊奇的疯狂事情。他们可以创建保存值叠加的变量。它们可以允许您在计算数据之前访问将来的数据。它们可以允许您编写破坏性的更新,但实际上不是。然后,延续monad可以让您大开眼界!通常是您自己的。;-) 但这是一个挑战:您可以制作一个可以暂停的单子吗? 数据暂停sx 实例Monad(Pause) 变异::(s-> s)->暂停s() 产量::暂停s() 步骤:: s->暂停s()->(s,也许(暂停s())) 该Pause单子是一种状态的单子(因此mutate,具有明显的语义)。通常,这样的monad具有某种“运行”功能,该功能运行计算并让您返回最终状态。但是Pause有所不同:它提供了一个step函数,该函数将运行计算直到调用魔术yield函数。在这里,计算被暂停,将足够的信息返回给调用者,以便以后恢复计算。 要获得更大的声望,请执行以下操作:允许呼叫者修改两次呼叫之间的状态step。(例如,上面的类型签名应允许这样做。) 用例:编写执行复杂功能的代码通常很容易,但是使用一个完整的PITA对其进行转换以在其操作中也输出中间状态。如果您希望用户能够在执行过程中进行某些更改,那么事情就会变得非常复杂。 实施思路: 显然,可以使用线程,锁和来完成IO。但是,我们可以做得更好吗?;-) 延续单子的疯狂吗? 也许是某种作家monad,它只yield记录当前状态,然后我们可以step通过遍历日志中的状态来“假装”它。(显然,这排除了在步骤之间更改状态的可能,因为我们现在并没有真正“暂停”任何内容。)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.