- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
使用 SYB 对树仅应用一次转换(而不是各处
)的最佳方法是什么?例如,在下面的简化表达式中,有多个 Var "x"
实例,我只想用 Var "y"
替换第一个实例。
数据 Exp = 变量字符串
|瓦尔国际
|加Exp Exp
|...
myExp = Val 5 `Plus` Var "x"`Plus` Val 5 `Plus` Var "x"...
这不能使用 everywhere
组合器来完成,因为它会尝试将 Var "x"
的所有实例转换为 Var "y"
.
编辑(发布后):看起来某处
就是我正在寻找的。
最佳答案
作为一名 SYB 初学者,我的答案更像是一个猜测,但似乎可行。
Neil Brown 推荐的Combinator somewhere
可能并不完全符合您的要求。这是defined作为
-- | Apply a monadic transformation at least somewhere
somewhere :: MonadPlus m => GenericM m -> GenericM m
-- We try "f" in top-down manner, but descent into "x" when we fail
-- at the root of the term. The transformation fails if "f" fails
-- everywhere, say succeeds nowhere.
--
somewhere f x = f x `mplus` gmapMp (somewhere f) x
哪里
-- | Transformation of at least one immediate subterm does not fail
gmapMp :: forall m. MonadPlus m => (forall d. Data d => d -> m d) -> a -> m a
但是我们最多需要转换一次。对于这一点,gmapMo
似乎会更好:
-- | Transformation of one immediate subterm with success
gmapMo :: forall m. MonadPlus m => (forall d. Data d => d -> m d) -> a -> m a
所以我制作了自己的组合器:
{-# LANGUAGE DeriveDataTypeable, RankNTypes #-}
import Control.Monad
import Data.Maybe (fromMaybe)
import Data.Data
import Data.Typeable (Typeable)
import Data.Generics.Schemes
import Data.Generics.Aliases
-- | Apply a monadic transformation once.
once :: MonadPlus m => GenericM m -> GenericM m
once f x = f x `mplus` gmapMo (once f) x
如果替换失败,则返回mzero
,否则返回替换结果。如果您不关心替换是否失败(没有匹配项),您可以使用类似
once' :: (forall a. Data a => a -> Maybe a) -> (forall a. Data a => a -> a)
once' f x = fromMaybe x (once f x)
有了这些,我们可以做一些替换:
data Exp = Var String | Val Int | Plus Exp Exp
deriving (Show, Typeable, Data)
myExp = Val 5 `Plus` Var "x" `Plus` Val 5 `Plus` Var "x"
replM :: (MonadPlus m) => Exp -> m Exp
replM (Var "x") = return $ Var "y"
replM t = mzero
main = do
-- `somewhere` doesn't do what we want:
print $ (somewhere (mkMp replM) myExp :: Maybe Exp)
-- returns `Just ..` if the substitution succeeds once,
-- Nothing otherwise.
print $ (once (mkMp replM) myExp :: Maybe Exp)
-- performs the substitution once, if possible.
print $ (once' (mkMp replM) myExp :: Exp)
-- Just for kicks, this returns all possible substitutions
-- where one `Var "x"` is replaced by `Var "y"`.
print $ (once (mkMp replM) myExp :: [Exp])
关于Haskell 的 Scrap Your Boilerplate (SYB) - 仅应用一次转换,而不是到处应用转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16910517/
我一直在查看 html5 样板,并注意到 jquery 包含 url 以双斜杠开头。网址是//ajax.googleapis.com/ajax/libs/jquery/1.5.1/jquery.min
window.jQuery || document.write('') 样板js文件调用方法 1- Why calling two times on the same file..?
我已经下载了 Angular 5 / .NET 5 project ,通常当我运行命令 npm install 时,我没有任何问题。 但是从昨天开始下载项目并运行此命令时,我收到此错误: C:\Use
我正在尝试扩展 AuditLog 中的实体ASPNET 样板 框架,以便为其添加一些新属性。我试图扩展 AuditLog类 ( ExtendedAuditInfo ) 并实现 AuditStore 的
我看到人们谈论在 Haskell 中废弃你的样板和泛型编程。这些术语是什么意思?我什么时候想使用 Scrap Your Boilerplate,我该如何使用它? 最佳答案 通常在对复杂数据类型进行转换
在 Apollo 应用程序(也包括 GraphQL/Relay)中,人们可以选择将数据需求并置到组件中,或者最终自己组装大型 GraphQL 查询。我们选择将数据需求并置到组件中,因为我们期望从长远来
我不想在 ASP.NET Boilerplate 中支持本地化,请告诉我如何禁用它(如果可能)。 最佳答案 注释掉 DefaultLanguagesCreator.cs 中的这些行: private
我不想在 ASP.NET Boilerplate 中支持本地化,请告诉我如何禁用它(如果可能)。 最佳答案 注释掉 DefaultLanguagesCreator.cs 中的这些行: private
嗯,我想部署 react-boilerplate项目到我的 digital ocean vps 服务器。命令 npm run start:product 通过地址 http://XXX.XXX.XXX
我要跑 react-boilerplate应用程序永远在服务器中。我找到了 forever而且我不确定如何将参数传递给永远。运行服务器的命令如下: PORT=80 npm run start:prod
这几天我开始使用 HTML5 样板,在我的实际元素中,我遇到了一些麻烦。如我所见,Boilerplate 的 CSS 定义了 有了这个: html { color: #222; fon
我创建了一个基于 Boilerplate 模板的简单 JQuery 插件。除了一个问题之外,它运行良好。当我将插件应用到第二个 时,第一个停止工作。此外,所有 div 都具有我在创建新实例时生成的相
我只是想知道如何在 Boilerplate 框架上禁用响应式 CSS。 到目前为止,我所做的是替换不同的属性,如下所示。它似乎适用于 chrome,但不适用于 IE 和 Firefox,所以我不确定如
我创建了一个 Laravel“样板”项目,其中包含我常用的功能/库。 将此样板文件用作新项目基础的正确 git 流程是什么?我可以想到两个选项: 将 boilerplate fork 到 newpro
Google 有一个 Python 教程,他们将样板代码描述为“不幸”并提供了以下示例: #!/usr/bin/python # import modules used here -- sys is
用户个人资料页面似乎不允许用户指定他们的时区。我们应该如何添加此功能,以便用户可以选择并保存他们的时区,然后让网页显示本地化日期? 我的浏览器显示的是服务器所在的时间,所以我在本地时间早上 7 点编辑
今天开始学习Mojolicious框架。恕我直言,最好的方法是“通过例子学习”,所以研究一些“已经完成”的应用程序。因此我下载了 Mojolicious-Boilerplate ,应该是 Mojoli
这个问题已经有答案了: How to access the correct `this` inside a callback (15 个回答) 已关闭 8 年前。 我正在尝试使用 jQuery Boi
我很难将依赖项添加到新生成的 react 样板项目中。我遇到这个错误: node.js:122 Uncaught SyntaxError: Unexpected token : (anonymous
我是 Haskell 新手,所以我想弄清楚如何进行树遍历。 这是我在几篇论文中看到的 Company 示例(略有改动) data Company = C [Dept] d
我是一名优秀的程序员,十分优秀!