- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
www.haskell.org 上的 wiki 告诉我们以下有关 Applicative Transformers 的信息:
So where are applicative transformers? The answer is, that we do not need special transformers for applicative functors since they can be combined in a generic way. http://www.haskell.org/haskellwiki/Applicative_functor#Applicative_transfomers
import Control.Applicative
import System.IO
ex x y = (:) <$> x <*> y
test1 = ex "abc" ["pqr", "xyz"] -- only this works correctly as expected
test2 = ex "abc" [Just "pqr", Just "xyz"]
test3 = ex "abc" (Just "pqr")
test4 = ex (Just 'a') ["pqr", "xyz"]
test5 = ex (return ("abc"):: IO ()) [Just "pqr", Just "xyz"]
example.hs:6:19:
Couldn't match expected type `[Char]' with actual type `Maybe a0'
In the return type of a call of `Just'
In the expression: Just "pqr"
In the second argument of `ex', namely `[Just "pqr", Just "xyz"]'
example.hs:7:19:
Couldn't match expected type `[[Char]]' with actual type `Maybe a0'
In the return type of a call of `Just'
In the second argument of `ex', namely `(Just "pqr")'
In the expression: ex "abc" (Just "pqr")
example.hs:8:23:
Couldn't match expected type `Maybe' with actual type `[]'
In the second argument of `ex', namely `["pqr", "xyz"]'
In the expression: ex (Just 'a') ["pqr", "xyz"]
In an equation for `test4': test4 = ex (Just 'a') ["pqr", "xyz"]
example.hs:9:21:
Couldn't match expected type `()' with actual type `[Char]'
In the first argument of `return', namely `("abc")'
In the first argument of `ex', namely `(return ("abc") :: IO ())'
In the expression:
ex (return ("abc") :: IO ()) [Just "pqr", Just "xyz"]
Failed, modules loaded: none.
Prelude>
最佳答案
考虑以下类型签名:
liftA2 :: (Applicative f) => (a -> b -> c) -> f a -> f b -> f c
(<*>) :: (Applicative f) => f (a -> b) -> f a -> f b
liftA2 (<*>) :: (Applicative f, Applicative g)
=> f (g (a -> b)) -> f (g a) -> f (g b)
Applicative
的组合s。事实上,它正好是两个
Applicative
的组合。 s。换句话说,虽然你可以组合
Applicative
s 以一般的方式,这不是以任何方式自动完成的。一切都必须明确提升正确的次数。
ex
函数等价于
liftA2 (:)
,其类型为
(Applicative f) => f a -> f [a] -> f [a]
.通过您的示例,对您想要做的事情进行一些猜测:
test1 = ex "abc" ["pqr", "xyz"]
f
是
[]
, 我们将其应用于
[Char]
类型的参数和
[[Char]]
.
test2 = ex "abc" [Just "pqr", Just "xyz"]
[Maybe [Char]]
,所以我们需要提升两次。第一个参数也需要解除,因为它的类型为
[Char]
应该是
[Maybe Char]
.
test3 = ex "abc" (Just "pqr")
Maybe [Char]
, 所以
f
是
Maybe
我们只需要一部电梯。因此,第一个参数应该是
Maybe Char
类型。 .
test4 = ex (Just 'a') ["pqr", "xyz"]
Maybe Char
但第二个是
[[Char]]
, 所以你有两个完全不同的
Applicative
小号;两者都需要解除,给你
[Maybe Char]
或
Maybe [Char]
.
test5 = ex (return ("abc"):: IO ()) [Just "pqr", Just "xyz"]
IO [Char]
.第二个参数的类型为
[Maybe [Char]]
.与前面的示例一样,它们不匹配,但这次您有三个
Applicative
s。如果你想要
IO [Maybe a]
之类的东西,您需要解除
(:)
所有三个时间,例如
liftA2 (liftA2 ex)
.
Applicative
s 称为“仿函数组合”,您链接到的页面提到了定义显式组合类型构造函数的库。例如,
using the transformers
library , 你可以有一个像
Compose IO (Compose [] Maybe)
这样的类型描述你的第五个例子。此组合类型定义为
Applicative
以上述通用方式为例,并应用正确数量的提升操作。缺点是您需要包装和打开
newtype
这需要的层。
So where are applicative transformers? The answer is, that we do not need special transformers for applicative functors since they can be combined in a generic way.
Applicative
的组成s 也是
Applicative
, 但这不是组合
Applicative
的唯一方法!
StateT s m a
,相当于
s -> m (s, a)
,尽管它的定义略有不同。这也可以写成三个仿函数的组合:
((->) s)
,
m
, 和
((,) s)
,以及由此产生的
Functor
实例是正确的,但
Applicative
实例将是完全错误的。如果您从
State s a = s -> (a, s)
开始相反,没有办法定义
StateT s m
通过撰写
State s
和
m
.
StateT s (Either e)
本质上是 Parsec 等库中使用的典型解析器组合 monad 的简化版本,此类解析器是使用
Applicative
的知名场所之一。风格很流行。因此,在
Applicative
的地方暗示 monad 转换器风格的组合在某种程度上是不必要或多余的,这似乎有点误导。被关注到!
关于haskell - Haskell 应用变压器的例子,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12587195/
我正在通过 labrepl 工作,我看到了一些遵循此模式的代码: ;; Pattern (apply #(apply f %&) coll) ;; Concrete example user=> (a
我从未向应用商店提交过应用,但我会在不久的将来提交。 到目前为止,我对为 iPhone 而非 iPad 进行设计感到很自在。 我了解,通过将通用PAID 应用放到应用商店,客户只需支付一次就可以同时使
我有一个应用程序,它使用不同的 Facebook 应用程序(2 个不同的 AppID)在 Facebook 上发布并显示它是“通过 iPhone”/“通过 iPad”。 当 Facebook 应用程序
我有一个要求,我们必须通过将网站源文件保存在本地 iOS 应用程序中来在 iOS 应用程序 Webview 中运行网站。 Angular 需要服务器来运行应用程序,但由于我们将文件保存在本地,我们无法
所以我有一个单页客户端应用程序。 正常流程: 应用程序 -> OAuth2 服务器 -> 应用程序 我们有自己的 OAuth2 服务器,因此人们可以登录应用程序并获取与用户实体关联的 access_t
假设我有一个安装在用户设备上的 Android 应用程序 A,我的应用程序有一个 AppWidget,我们可以让其他 Android 开发人员在其中以每次安装成本为基础发布他们的应用程序推广广告。因此
Secrets of the JavaScript Ninja中有一个例子它提供了以下代码来绕过 JavaScript 的 Math.min() 函数,该函数需要一个可变长度列表。 Example:
当我分别将数组和对象传递给 function.apply() 时,我得到 NaN 的 o/p,但是当我传递对象和数组时,我得到一个数字。为什么会发生这种情况? 由于数组也被视为对象,为什么我无法使用它
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界. 这篇CFSDN的博客文章ASP转换格林威治时间函数DateDiff()应用由作者收集整理,如果你
我正在将列表传递给 map并且想要返回一个带有合并名称的 data.frame 对象。 例如: library(tidyverse) library(broom) mtcars %>% spl
我有一个非常基本的问题,但我不知道如何实现它:我有一个返回数据框,其中每个工具的返回值是按行排列的: tmp<-as.data.frame(t(data.frame(a=rnorm(250,0,1)
我正在使用我的 FB 应用创建群组并邀请用户加入我的应用群组,第一次一切正常。当我尝试创建另一个组时,出现以下错误: {"(OAuthException - #4009) (#4009) 在有更多用户
我们正在开发一款类似于“会说话的本”应用程序的 child 应用程序。它包含大量用于交互式动画的 JPEG 图像序列。 问题是动画在 iPad Air 上播放正常,但在 iPad 2 上播放缓慢或滞后
我关注 clojure 一段时间了,它的一些功能非常令人兴奋(持久数据结构、函数式方法、不可变状态)。然而,由于我仍在学习,我想了解如何在实际场景中应用,证明其好处,然后演化并应用于更复杂的问题。即,
我开发了一个仅使用挪威语的应用程序。该应用程序不使用本地化,因为它应该仅以一种语言(挪威语)显示。但是,我已在 Info.plist 文件中将“本地化 native 开发区域”设置为“no”。我还使用
读完 Anthony's response 后上a style-related parser question ,我试图说服自己编写单体解析器仍然可以相当紧凑。 所以而不是 reference ::
multicore 库中是否有类似 sapply 的东西?还是我必须 unlist(mclapply(..)) 才能实现这一点? 如果它不存在:推理是什么? 提前致谢,如果这是一个愚蠢的问题,我们深表
我喜欢在窗口中弹出结果,以便更容易查看和查找(例如,它们不会随着控制台继续滚动而丢失)。一种方法是使用 sink() 和 file.show()。例如: y <- rnorm(100); x <- r
我有一个如下所示的 spring mvc Controller @RequestMapping(value="/new", method=RequestMethod.POST) public Stri
我正在阅读 StructureMap关于依赖注入(inject),首先有两部分初始化映射,具体类类型的接口(interface),另一部分只是实例化(请求实例)。 第一部分需要配置和设置,这是在 Bo
我是一名优秀的程序员,十分优秀!