- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在编写一个函数,该函数接受一个值作为输入,在该输入上调用一个函数,如果结果是Just x
,它应该返回x
;否则,它应该返回原始输入。
换句话说,这个函数(我不知道该调用什么):
foo :: (a -> Maybe a) -> a -> a
foo f x = fromMaybe x (f x)
由于它看起来像一个通用函数,我想知道它是否尚未定义,所以 I asked on Twitter ,和Chris Allen replied这是ap fromMaybe
。
这听起来很有希望,所以我启动了 GHCI 并开始试验:
Prelude Control.Monad Data.Maybe> :type ap
ap :: Monad m => m (a -> b) -> m a -> m b
Prelude Control.Monad Data.Maybe> :type fromMaybe
fromMaybe :: a -> Maybe a -> a
Prelude Control.Monad Data.Maybe> :type ap fromMaybe
ap fromMaybe :: (b -> Maybe b) -> b -> b
ap fromMaybe
的类型看起来确实是正确的,并且一些实验似乎表明它也具有所需的行为。
但是它是如何工作的?
fromMaybe
函数对我来说似乎很清楚,并且单独来看,我认为我理解 ap
的作用 - 至少在 Maybe
的上下文中>。当m
为Maybe
时,它的类型为Maybe (a -> b) -> Maybe a -> Maybe b
。
我不明白的是 ap fromMaybe
是如何编译的。对我来说,这个表达式看起来像是部分应用,但我可能会弄错。但是,如果是这种情况,我不明白类型如何匹配。
ap
的第一个参数是 m (a -> b)
,但 fromMaybe
的类型为 a -> Maybe一个->一个
。那如何匹配?编译器推断出 m
是哪个 Monad
实例?带有两个(柯里化(Currying))参数的 fromMaybe
如何变成带有单个参数的函数?
有人可以帮我把这些点联系起来吗?
最佳答案
但是使用ap
是不在 Maybe
的上下文中。我们将它与函数 fromMaybe
一起使用。 ,所以它是在函数的上下文中,其中
ap f g x = f x (g x)
各种Monad
我们拥有的实例
instance Monad ((->) r)
原来如此
ap :: Monad m => m (a -> b) -> m a -> m b
fromMaybe :: r -> (Maybe r -> r)
ap :: (r -> (a -> b)) -> (r -> a) -> (r -> b)
ap f g x :: b
ap fromMaybe :: (r -> a) -> (r -> b) , a ~ Maybe r , b ~ r
因为->
在类型中与右侧关联:a -> b -> c ~ a -> (b -> c)
。尝试将这些类型连接在一起,我们只能得到上面的定义。
并与 (<*>) :: Applicative f => f (a -> b) -> f a -> f b
,我们可以将其写为(fromMaybe <*>)
,如果你喜欢这种涂鸦:
#> :t (fromMaybe <*>)
(fromMaybe <*>) :: (r -> Maybe r) -> r -> r
<小时/>
正如此处另一个答案中正确指出的那样,当与函数一起使用时,<*>
就是你的好'S combinator 。我们不能很好地拥有名为 S
的函数在 Haskell 中,所以 <*>
只是无点编码风格的标准轨道的一部分。单子(monad)绑定(bind)(更是如此,翻转),=<<
,可能更加神秘,但是 pointfree 编码器并不关心,并且会很乐意使用它来编码另一个类似的模式,
(f =<< g) x = f (g x) x
在 combinatory函数调用,神秘与否(我想到了zipWith (-) =<< drop 1
)。
关于haskell - ap fromMaybe 是如何组成的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34622482/
我注意到在将日期转换为字符串时缺少“ap/a/AP/a”。对于“h:m:s ap”,即我得到“11:5:42”。对于每个“ap/a/AP/a”形式也会发生同样的情况。 我缺少什么? void Deco
我想扫描并列出可用的 WIFI 接入点,并允许用户从 Windows 应用商店应用程序的自定义界面连接到一个接入点。 我知道 WiFi native API,但无法在 Windows 应用商店应用程序
所以在 Xcode 中,供应配置文件说 aps-environment 授权是其中的一部分,但在存档之后供应配置文件缺少 aps-entitlement。 最佳答案 Xcode 8 发行说明提到了这个
我试图了解ap,但遇到了麻烦。 在 fantasyland ,詹姆斯·福布斯 说: First we teach a function how to interact with our type, b
我的字符串是“2358132235”。我需要找出这是否是字符串数字正在进行算术级数。我可以做到直到8,但当我达到13时,我不知道如何处理多位数字在这里。有人可以帮忙吗。谢谢。 私有(private)静
刚收到一封来自 Apple 的电子邮件,说明我的应用是(复制如下) 好的,没问题。我删除了旧的配置文件,确保新的配置文件有一个 aps key **aps-environment production
这个问题不太可能帮助任何 future 的访问者;它只与一个小的地理区域、一个特定的时间点或一个非常狭窄的情况有关,这些情况并不普遍适用于互联网的全局受众。为了帮助使这个问题更广泛地适用,visit
1、视图 ? 1
with data as ( select 1 id, 'A' name, 'fruit' r_group, '2007' year, '04' month, 5 sales from dual
由于某种原因,我们的临时配置文件没有 aps-environment 权利!我们已确保在为该应用 ID 启用生产 apns 后生成配置文件。实际上,我们甚至为该应用程序 ID 创建了一个新的临时配置文
我已阅读 Where does xcode take application's Identifier from? , XCode bundle identifier formatting from
我正在经历https://www.scala-exercises.org/对于猫来说。我想我明白Apply.ap 是什么意思。但我看不到它有任何用途。 有什么区别: Apply[Option].map
我正在编写一个函数,该函数接受一个值作为输入,在该输入上调用一个函数,如果结果是Just x,它应该返回x;否则,它应该返回原始输入。 换句话说,这个函数(我不知道该调用什么): foo :: (a
我是OpenCV的新手。我正在使用anaconda spyder控制台编写Python代码。我在这里采用了代码形式(https://www.pyimagesearch.com/2014/08/25/4
在 Haskell 中使用“ap”monad 的正确方法是什么?我想做类似的事情: main = (putStr . ap (++) show) "main = (putStr . ap (++) s
在我接触到这个方法之前,我以为我理解了递归。我对这件事的时间安排感到非常惊讶,因此请求你们的帮助。 public static void mystery5(String sWord) { in
我正在经历https://www.scala-exercises.org/对于猫来说。我想我明白Apply.ap 是什么意思。但我看不到它有任何用途。 有什么区别: Apply[Option].map
我的应用程序在构建期间安装的 Android 设备上成功运行,但是当我通过蓝牙/whatsapp 从我的设备将此应用程序发送到另一台设备时,它无法在此设备上运行,显示应用程序未安装错误...任何机构都
问题是: 给定一个由未知大小的整数和其他三个 int 值组成的 ArrayList,删除 ArrayList 中位于 int 值指定的索引位置的三个元素。将 ArrayList 的第一个元素设置为三个
我是一名计算机科学学生,我不明白为什么我的添加索引的语句不起作用。具体来说,我应该编写一个脚本,为供应商表中的邮政编码字段添加 AP 数据库的索引。我尝试使用以下声明来做到这一点: CREATE IN
我是一名优秀的程序员,十分优秀!