Tag: 单子

IO = monad的定义是什么?

在看到List和Maybe monads是如何定义的之后,我自然而然地开始对IO monad的操作>>=和return是如何定义的。

在C#中使用Maybe monad和扩展方法?

编辑2015这个问题和它的答案不再相关。 在C#6出现之前,有一个空传播运算符(?)被提出来,它避免了在这个问题和随后的答案中讨论的hacky-workarounds。 截至2015年,在C#中,您现在应该使用Form.ActiveForm?.ActiveControl?.Name。 我一直在思考在.NET中的空传播问题,这往往导致丑陋,重复的代码,如下所示: 尝试#1通常的代码: string activeControlName = null; var activeForm = Form.ActiveForm; if (activeForm != null) { var activeControl = activeForm.ActiveControl; if(activeControl != null) { activeControlname = activeControl.Name; } } 关于一个Maybe <T> monad,或者使用某种“if not null”扩展方法,已经在StackOverflow上进行了一些讨论: 尝试#2,扩展方法: // Usage: var activeControlName = Form.ActiveForm .IfNotNull(form => form.ActiveControl) .IfNotNull(control => control.Name); // Definition: public static TReturn IfNotNull<TReturn, […]

取消select一个选项

说我有一个val s: Option[Option[String]] 。 因此它可以有以下值: Some(Some("foo")) Some(None) None 我想减less它,以便第一个变成Some("foo")而其他两个变成None 。 显然有很多方法可以完成这个任务,但是我正在寻找一个简单的,也许是内置的,不到一个class轮。

Monad理论和Haskell

大多数教程似乎给了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的这些子集? 为什么他们是自然的转变? 马丁

在列表monad中使用return和not使用return

我开始了我的大哈斯克尔十字军(GHC :),我对单子和IOfunction有些困惑。 任何人都可以解释这两个函数有什么区别吗? f1 = do x <- [1,2] [x, x+1] — this is monad, right? f2 = do x <- [1,2] return [x, x+1] 结果是: *Main> f1 [1,2,2,3] *Main> f2 [[1,2],[2,3]]

在haskell中定义一个新monad不会引发Applicative的实例

我正在尝试定义一个新的monad,并且出现一个奇怪的错误 newmonad.hs 新types包装a =包装{unwrap :: a} 实例Monad包裹在哪里 (>> =)(Wrap x)f = fx 返回x =包装x main = do putStrLn“耶” $ ghc –version Glorious Glasgow Haskell编译系统,版本7.10.1 $ ghc newmonad.hs [1的1]编译主(newmonad.hs,newmonad.o) newmonad.hs:2:10: 没有适用于(应用包装)的实例 来自实例声明的超类 在“Monon Wrapped”的实例声明中 为什么我需要定义一个Applicative实例?

我如何做Haskell日志?

我正在尝试使用HSlogger获取有关我的程序的一些信息。 所以我添加下面的行到我的function import Data.Word import qualified Data.ByteString as B import qualified Data.ByteString.Lazy as L import Data.Bits import Data.Int import Data.ByteString.Parser import System.Log.Logger import System.Log.Handler.Syslog importFile :: FilePath -> IO (Either String (PESFile )) importFile n = do warningM "MyApp.Component2" "Something Bad is about to happen." … 这工作正常,因为function是在IO内。 但是,当我添加一个类似的行到以下function: … parsePES :: Parser PESFile parsePES = […]

在“反向”中使用Maybe Monad

假设我有许多function: f :: a -> Maybe a g :: a -> Maybe a h :: a -> Maybe a 我想用下面的方式来编写它们:如果f返回Nothing,则计算g。 如果g返回Nothing,则计算h。 如果他们中的任何一个计算Just a,则停止链。 而整个作品(例如f)当然应该返回Maybe a。 这与Maybe monad的典型用法相反,如果返回Nothing则通常停止计算。 链式计算这样的Haskell成语是什么?

IO Monad纯粹是什么意思?

我已经把IO monad描述为一个国家单体,国家是“真实的世界”。 这种IO方法的支持者认为,这使得IO操作是纯粹的,就像在透明中一样。 这是为什么? 从我的angular度来看,IO monad中的代码有很多可观察到的副作用。 另外,难道不可能像真实世界的函数那样描述任何非纯粹的function吗? 例如,我们不能把C的malloc看作是一个函数,它需要一个RealWorld和一个Int,并且返回一个指针和一个RealWorld ,就像RealWorld隐含的IO monad一样。 注意:我知道monad是什么,以及它是如何使用的。 请不要回应一个随机monad教程的链接,除非它特别强调我的问题。

为什么monads? 它如何解决副作用?

我正在学习Haskell并试图理解Monads。 我有2个问题。 据我所知,Monad只是另一个types类,它声明了与“容器”内的数据进行交互的方法,包括Maybes,Lists和IOs。 用一个概念来实现这3个东西似乎是聪明和干净的,但真正的重点是在一系列函数,容器和副作用中可以有一个干净的error handling。 这是一个正确的解释? 其次,副作用的问题究竟如何解决? 用这个容器的概念,语言本质上是说容器内的任何东西都是非确定性的(如I / O)。 因为列表和IO都是容器,所以列表与IO是等价的,即使列表中的值对我来说也是相当确定的。 那么什么是确定性的,什么是副作用呢? 我不能把我的头围绕一个基本的值是确定性的想法,直到你把它放在一个容器中(这个容器没有什么特别的地方,而且它旁边还有一些其他值,例如Nothing),现在可以是随机的。 有人可以解释一下,Haskell如何通过input和输出改变状态? 我在这里看不到魔法。