- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在学习 Haskell 并试图理解 Monads。我有两个问题:
Maybe
, List
, 和 IO
.用一个概念实现这 3 件事似乎既聪明又干净,但实际上,重点是可以在一系列函数、容器和副作用中进行干净的错误处理。这是正确的解释吗? Nothing
),现在它可以随机。 最佳答案
The point is so there can be clean error handling in a chain of functions, containers, and side effects. Is this a correct interpretation?
addM :: (Monad m, Num a) => m a -> m a -> m a
addM ma mb = do
a <- ma
b <- mb
return (a + b)
do
语法去糖如下:
addM ma mb =
ma >>= \a ->
mb >>= \b ->
return (a + b)
ma >>= (\a -> mb >>= (\b -> return (a + b)))
>>=
和
return
为每个 monad 定义。如果您熟悉面向对象语言中的多态性,那么这本质上是一回事:一个具有多个实现的通用接口(interface)。它比一般的 OOP 界面更令人费解,因为该界面代表一种计算策略,而不是动物或形状或其他东西。
addM
在不同的 monad 中表现。
Identity
monad 是一个不错的起点,因为它的定义很简单:
instance Monad Identity where
return a = Identity a -- create an Identity value
(Identity a) >>= f = f a -- apply f to a
addM (Identity 1) (Identity 2)
(Identity 1) >>= (\a -> (Identity 2) >>= (\b -> return (a + b)))
(\a -> (Identity 2) >>= (\b -> return (a + b)) 1
(Identity 2) >>= (\b -> return (1 + b))
(\b -> return (1 + b)) 2
return (1 + 2)
Identity 3
Maybe
单子(monad)。它的定义只是比
Identity
稍微复杂一点。 :
instance Monad Maybe where
return a = Just a -- same as Identity monad!
(Just a) >>= f = f a -- same as Identity monad again!
Nothing >>= _ = Nothing -- the only real difference from Identity
addM (Just 1) (Just 2)
我们会得到
Just 3
.但是为了咧嘴笑,让我们扩展
addM Nothing (Just 1)
反而:
Nothing >>= (\a -> (Just 1) >>= (\b -> return (a + b)))
Nothing
addM (Just 1) Nothing
:
(Just 1) >>= (\a -> Nothing >>= (\b -> return (a + b)))
(\a -> Nothing >>= (\b -> return (a + b)) 1
Nothing >>= (\b -> return (1 + b))
Nothing
Maybe
monad 的定义
>>=
被调整以解释失败。当函数应用于
Maybe
值使用
>>=
,你会得到你所期望的。
[1, 2, 3]
不是一个集合,它是一个单一的非确定性数字,可以是一、二或三。这听起来很愚蠢,但是当您考虑如何
>>=
时,它开始变得有意义了。为列表定义:它将给定的函数应用于每个可能的值。所以
addM [1, 2] [3, 4]
实际上要计算这两个非确定性值的所有可能总和:
[4, 5, 5, 6]
.
addM
到
IO
中的两个值monad,比如:
addM (return 1 :: IO Int) (return 2 :: IO Int)
IO
单子(monad)。
addM
不读取或写入任何可变状态,所以它有点不好玩。
State
也是如此或
ST
单子(monad)。没有乐趣。所以让我们使用一个不同的函数:
fireTheMissiles :: IO Int -- returns the number of casualties
add :: Num a => a -> a -> a
add a b = a + b
add a b = a + b + fireTheMissiles
fireTheMissiles
类型为
IO Int
而不是简单的
Int
,编译器能够避免灾难。
IO
的情况下,
ST
和 friend 们,类型系统将效果隔离到某些特定的上下文中。它并没有神奇地消除副作用,使代码引用透明,这不应该是透明的,但它确实在编译时明确了影响限制在什么范围内。
fireTheMissilesTwice :: IO ()
fireTheMissilesTwice = do
a <- fireTheMissiles
print a
b <- fireTheMissiles
print b
Identity
的策略是纯函数组合,
Maybe
的策略是具有失败传播的函数组合,
IO
的策略是不纯函数组合等等。
关于haskell - 为什么是单子(monad)?它如何解决副作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7840126/
monad 被定义为类别 C 上的内仿函数。假设 C 具有类型 int 和 bool 以及其他构造类型作为对象。现在让我们考虑在这个类别上定义的列表 monad。 根据它的定义,list 是一个内仿函
我试图采取例如ExceptT a (StateT A M) , 对于某些具体类型 A和单子(monad)M ,并将它们包装到我的新自定义单子(monad)中。 首先我确定StateT A M经常出现在
我读到(例如 here 和 here )所有基本单子(monad)(Mabye, Error, ...) 源自其相应的 monad 转换器(MaybeT, ErrorT, ...) 使用身份 mona
Haskell 的状态单子(monad) State s a迫使我保持相同类型的 s在整个做 block 期间。但是由于 state monad 实际上只是一个函数,如果我将它定义为 State
我一直在阅读some materials on free monads而且我真的不认为我离实现更近了,但我认为我更接近于理解它们是什么! 鉴于上述大量资源,我的理解是自由单子(monad)从“计算”工
假设我有一个由两个 monad 操作组成的函数: co::Monad m => m a -> m a -> m a 您可以将 co 视为一个高阶函数,它描述两个单子(monad)操作如何相互协作来完成
在 SO解释了为什么像 scalaz、cats (Scala) 或 Arrow (Kotlin) 中的 Validation 不能是 monad。 据我所知,这是因为他们已经根据应用仿函数对 mona
我对 Haskell 还很陌生,并且慢慢地意识到 Monad fail 的存在有问题。真实世界的 Haskell warns against its use (“再一次,我们建议您几乎总是避免使用失败
我正在阅读现实世界 Haskell 中的 monad 转换器。在以下示例中,堆栈为 Writer在顶部State在Reader之上在IO之上。 {-# Language GeneralizedNewt
我看到的典型 Pause monad 实现如下所示(基于 Giulia Costantini 和 Giuseppe Maggiore 编写的 Friendly F# 的第 5 章)。 open Sys
“Monads 允许程序员使用顺序构建 block 来构建计算”,因此它允许我们组合一些计算。如果是这样,那为什么下面的代码不能运行呢? import Control.Monad.Trans.Stat
这是我第一次认识 Monad Transformers,所以答案可能很明显。 假设我在 StateT MyMonad MyType 类型的 do 块中,我想让另一个相同类型的函数修改状态并返回 MyM
人们通常说类型是单子(monad)。 在某些函数式语言和库(如 Scala/Scalaz)中,您有一个类型构造函数,如 List 或 Option,您可以定义一个与原始类型分离的 Monad 实现。所
我的目标是创建一个函数,该函数在 ReaderT WriterT 堆栈或 RWS 堆栈中使用 list monad。更一般地说,我如何在 mtl 类型类(如 MonadReader、MonadWrit
我只是想知道是否有一个简洁的术语来表示既是单子(monad)又是单子(monad)的东西。我做了一些搜索,我知道these structures exist ,但我还没有找到他们的名字。 最佳答案 在
我正在玩写一个网络应用程序。在这种情况下,我使用 scotty和 redis ,但是这个问题出现在任何 web/db 组合中。在此之前我使用了 happstack,所以我也喜欢那里的一个例子。 Sco
是 x >>= f相当于 retract (liftF x >>= liftF . f) ? 也就是说,从同样是 Monad 的 Functor 构建的自由 monad 的 monad 实例是否将具有
我正在尝试编写一个只能包含 Num 的新 monad。当它失败时,它返回 0,就像 Maybe monad 在失败时返回 Nothing 一样。 这是我到目前为止所拥有的: data (Num a)
我正在使用 operational monad作者:海因里希·阿普菲尔姆斯。 我想用结果类型的 monad 参数化解释器。 我的代码的以下版本编译: {-# LANGUAGE GADTs #-} im
假设所有的 monad 都可以用 Free 来表示。 (如果这不是真的,什么是反例,为什么)?怎么可能the continuation monad或其对应的变压器用 Free 表示或 FreeT -
我是一名优秀的程序员,十分优秀!