我正在考虑一个函数,当z
为x
时,可以用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);
这种简单的功能是否有更好的无点形式?
答案 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)
答案 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