做“replace-if”的最佳方法是什么?

时间:2016-11-14 09:08:47

标签: haskell pointfree

我正在考虑一个函数,当zx时,可以用y替换值\x -> if x == y then z else x ,否则不执行任何操作,即:

(ap . flip . bool id $ const z) (== y)

它只在我的程序中使用过一次,并且它位于函数链的中间,所以我不想将它定义为命名函数,我认为lambda表达式看起来不必要地冗长。相反,我试图从其他功能组成它。然而,到目前为止,我只提出了这个神秘的(和cring-y):

DynamicQuery childQuery = DynamicQueryFactoryUtil.forClass(JournalArticle.class, "child", classLoader);
ProjectionList projectionList = ProjectionFactoryUtil.projectionList();
projectionList.add(ProjectionFactoryUtil.max("version"));
projectionList.add(ProjectionFactoryUtil.groupProperty("articleId"));
childQuery.add(PropertyFactoryUtil.forName("child.articleId").eqProperty("parent.articleId"));
childQuery.setProjection(projectionList);

这种简单的功能是否有更好的无点形式?

4 个答案:

答案 0 :(得分:5)

我不知道什么是非常可读的。我能得到的最短是

bool z <*> (/= y)

进一步愚蠢的方式:

execState (gets (==y) >>= flip when (put z))

fromMaybe <*> flip lookup [(y, z)]

答案 1 :(得分:4)

我不太赞同这一点,但是Hayoo search快速(?|)引导我进入data-easy包裹中的fromBoolC运营商。这个软件包充满了这些功能(有一堆免责声明关于&#34;非惯用的haskell&#34;)。看起来你可能有

\x -> if x == y then z else x  -- the cluttered Haskell form

\x -> x ?| (/= y) $ z          -- the "Pythonic" form

(?| (/= y)) z                  -- Haskell-sections-galore of the "Pythonic" form

除了笑话,你可能会更喜欢Capture Screenshot and store to sdcard

fromBoolC z (/= y)

答案 2 :(得分:4)

来自lens

import Control.Lens

f = (^. non z) . (non y # ) -- for some z and y

if then else版本肯定更好。

答案 3 :(得分:1)

您可以使用Python技巧用查找替换case语句。

import Data.Map

\x -> findWithDefault x x (singleton y z)

根据pointfree.io可以缩减为

flip (join findWithDefault) (singleton y z)

它不是很清楚,但同时它将功能部分与参数分开。 flip (join findWithDefault)执行您想要的操作,singleton y z是一种类似DSL的指定异常的方式。在您的代码中先粘贴idExcept = flip (join findWithDefault)exception = singleton,您的链几乎可读。

my . awesome . (idExcept (exception y z)) . function . chain $ val