- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
GHC 可以将 id = (\(a, b) -> (a, b)).(\(a, b) -> (a, b))
简化为 id = \(a, b) -> (a, b)
吗?
更复杂的情况呢:
id (Just x) = Just x
id Nothing = Nothing
map f (Just x) = Just (f x)
map _ Nothing = Nothing
id . map
简化为
map
吗?
最佳答案
您可以通过运行 -ddump-simpl
来询问 ghc 的这些问题。这将导致 ghc 转储它编译程序的“核心”代码。 Core 是一种介于解释 Haskell 代码的编译器部分和将代码转换为机器代码的编译器部分之间的中间语言。
当我用 -O2 -ddump-simpl
编译以下内容时,结果让我感到惊讶。
tupid1 :: (a, b) -> (a, b)
tupid1 = (\(a, b) -> (a, b))
tupid2 :: (a, b) -> (a, b)
tupid2 = (\(a, b) -> (a, b)) . (\(a, b) -> (a, b))
tupid1
核心生成了一个新的专用标识函数。
-- RHS size: {terms: 4, types: 7, coercions: 0}
tupid1 :: forall a_aqo b_aqp. (a_aqo, b_aqp) -> (a_aqo, b_aqp)
[GblId,
Arity=1,
Caf=NoCafRefs,
Str=DmdType <S,1*U(U,U)>m,
Unf=Unf{Src=InlineStable, TopLvl=True, Value=True, ConLike=True,
WorkFree=True, Expandable=True,
Guidance=ALWAYS_IF(arity=1,unsat_ok=True,boring_ok=True)
Tmpl= \ (@ a_ayd)
(@ b_aye)
(ds_dIl [Occ=Once] :: (a_ayd, b_aye)) ->
ds_dIl}]
tupid1 = \ (@ a_ayd) (@ b_aye) (ds_dIl :: (a_ayd, b_aye)) -> ds_dIl
tupid1
使用其中两个类型参数,名为
a_ayd
和
b_aye
,用于其签名中的两个类型变量
a
和
b
。它还需要一个术语
ds_dIl
,它具有这两种类型 (
ds_dIl :: (a_ayd, b_aye)
) 的元组类型,并未经修改地返回它。
tupid2
...
-- RHS size: {terms: 1, types: 0, coercions: 0}
tupid2 :: forall a_aqm b_aqn. (a_aqm, b_aqn) -> (a_aqm, b_aqn)
[GblId,
Arity=1,
Caf=NoCafRefs,
Str=DmdType <S,1*U(U,U)>m,
Unf=Unf{Src=InlineStable, TopLvl=True, Value=True, ConLike=True,
WorkFree=True, Expandable=True,
Guidance=ALWAYS_IF(arity=1,unsat_ok=True,boring_ok=True)
Tmpl= \ (@ a_axZ) (@ b_ay0) (x_aIw [Occ=Once] :: (a_axZ, b_ay0)) ->
x_aIw}]
tupid2 = tupid1
tupid1
!它如何推断出超出了我直接知识或发现能力的范围。
Maybe
的身份示例
maybeid :: Maybe a -> Maybe a
maybeid (Just x) = Just x
maybeid Nothing = Nothing
-- RHS size: {terms: 3, types: 4, coercions: 0}
maybeid :: forall a_aqn. Maybe a_aqn -> Maybe a_aqn
[GblId,
Arity=1,
Caf=NoCafRefs,
Str=DmdType <S,1*U>,
Unf=Unf{Src=InlineStable, TopLvl=True, Value=True, ConLike=True,
WorkFree=True, Expandable=True,
Guidance=ALWAYS_IF(arity=1,unsat_ok=True,boring_ok=True)
Tmpl= \ (@ a_aqI) (ds_dIq [Occ=Once] :: Maybe a_aqI) -> ds_dIq}]
maybeid = \ (@ a_aqI) (ds_dIq :: Maybe a_aqI) -> ds_dIq
map
的
Maybe
核心对于这个问题不感兴趣
maybemap :: (a -> b) -> Maybe a -> Maybe b
maybemap f (Just x) = Just (f x)
maybemap _ Nothing = Nothing
maybeid
组成的
maybeidmap :: (a -> b) -> Maybe a -> Maybe b
maybeidmap f = maybeid . maybemap f
maybemap
-- RHS size: {terms: 1, types: 0, coercions: 0}
maybeidmap
:: forall a_aqp b_aqq.
(a_aqp -> b_aqq) -> Maybe a_aqp -> Maybe b_aqq
[GblId,
Arity=2,
Caf=NoCafRefs,
Str=DmdType <L,1*C1(U)><S,1*U>,
Unf=Unf{Src=InlineStable, TopLvl=True, Value=True, ConLike=True,
WorkFree=True, Expandable=True,
Guidance=ALWAYS_IF(arity=0,unsat_ok=True,boring_ok=True)
Tmpl= maybemap}]
maybeidmap = maybemap
id
由
f
组成,它会做同样的事情。
maybemapid :: (a -> b) -> Maybe a -> Maybe b
maybemapid f = maybemap (id . f)
maybemap
-- RHS size: {terms: 1, types: 0, coercions: 0}
maybemapid
:: forall a_aqq b_aqr.
(a_aqq -> b_aqr) -> Maybe a_aqq -> Maybe b_aqr
[GblId,
Arity=2,
Caf=NoCafRefs,
Str=DmdType <L,1*C1(U)><S,1*U>,
Unf=Unf{Src=InlineStable, TopLvl=True, Value=True, ConLike=True,
WorkFree=True, Expandable=True,
Guidance=ALWAYS_IF(arity=2,unsat_ok=True,boring_ok=False)
Tmpl= \ (@ a_ar2)
(@ b_ar3)
(f_aqL [Occ=Once!] :: a_ar2 -> b_ar3)
(eta_B1 [Occ=Once!] :: Maybe a_ar2) ->
case eta_B1 of _ [Occ=Dead] {
Nothing -> GHC.Base.Nothing @ b_ar3;
Just x_aqJ [Occ=Once] -> GHC.Base.Just @ b_ar3 (f_aqL x_aqJ)
}}]
maybemapid = maybemap
关于Haskell : Will GHC optimize this?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43972040/
我认为在程序的顶层,will end 和 will leave 的行为是一样的,因为只有一个大的外部作用域可以退出/离开。我认为这两种方法都是检查变量最终值的好方法。 但是 will end 就像变量
我正在使用 C18 在 PIC18 上构建 16 状态 FSM。我正在考虑将每个状态作为其自己的函数,该函数会跳转到其他状态并被其他状态跳转。我很想在每个状态的末尾编写一个“state##();”的分
I have created an API authorization system for accessing data with an API KEY in the server . I c
如图所示,State不会被放置在构造函数中会导致错误。但是,如果状态放置在构造函数内,则不会。 但是,如果你为状态声明一个类型,也可以。 请 最佳答案 当你这样做 state = { quota:
一个月前困扰我的同样问题现在仍然困扰着我。我知道我在这个网站上问了几个关于这个的问题,我真的很抱歉。你的建议都很好,但答案仍然难以捉摸。我现在意识到这是我无法正确表达我的问题的直接结果,对此我深表歉意
在 Dagger2 的文档中,它说 If your class has @Inject-annotated fields but no @Inject-annotated constructor, D
这个问题在这里已经有了答案: Select nth-child across multiple parents (2 个答案) 关闭 5 年前。
我正在尝试优化我的网络应用程序的滚动。我有包含大量数据的数据表,滚动变得非常糟糕。我将 will-change: transform 添加到数据表中,但它破坏了我的 position: fixed 表
我想创建一个行为如下的控制台应用程序: 应用程序的第一个实例将执行一个流程。 稍后执行的第二个实例将终止进程。 有没有简单的方法可以做到这一点? 编辑:第二个实例也终止第一个实例和它自己。 编辑 2:
我的站点是托管在 Heroku 上的 Rails 应用程序。我打算为站点删除 SSL(只是要注释掉 config.force_ssl 行)。 我打算改变现状,仅将 SSL 用于登录/注册,但这会解决我
为什么 Fabric“Fabric iOS 和 Android 移动应用程序将于 2018 年 11 月 30 日停用。在此日期之后,您将无法登录应用程序”会关闭吗? 最佳答案 只需查看此官方帖子即可
Flash 的 MovieClip 时间轴的创建方式可以跳过帧以保持动画平滑度和音频同步。 我的问题是,如果帧上有 ActionScript,是否有可能跳过该帧,从而不调用脚本? 或者有脚本的帧永远不
我对“名称”索引运行全文搜索,但我忽略了名称“Will”,因为“will”一词位于忽略列表中。 我的数据库托管在共享主机中,无法配置它。正确搜索的可能解决方案是什么? 最佳答案 作为 fulltext
GHC 可以将 id = (\(a, b) -> (a, b)).(\(a, b) -> (a, b)) 简化为 id = \(a, b) -> (a, b) 吗? 更复杂的情况呢: id (Just
我想从 Dockerfile 构建 Docker 容器。它包含一个私有(private)项目。 我的问题很简单,我没有找到明确的答案:构建镜像后,它会自 Action 为公共(public)镜像发送到
是否有可能在 iOS 上获得“将轮换”通知,之前 执行旋转动画?喜欢 UIViewController方法willRotateToInterfaceOrientation:duration: . 我知
问题:我什么时候可以说跨平台工具可以处理这种类型的开发..? 以下是不需要回答的问题。这些只是我提出问题的指导,以避免描述过长。 对于游戏开发: 工具(即phoneGap、widgetPad 等)是否
看完post在 CSS 技巧上,我注意到帖子末尾的一条建议 it’s recommended to toggle on will-change just before an element or pr
我有一个 css prop 就像声明的那样 #menu li#selected { padding: 0 10px; margin:0; background:url(nav-tab-left.gif
我不知道如何从这个问题开始: 一个图有 n 个顶点和 m 条边。没有两对顶点可以由多于一条边连接。Rahul 开始玩游戏:他以下列方式改变边缘 - 他选择一个顶点,并从该顶点向不存在边的所有其他顶点添
我是一名优秀的程序员,十分优秀!