我有一个我经常使用的函数,它允许我以对我来说更自然的方式编写代码。
infixl 6 $:
($:) :: a -> (a -> b) -> b
a $: f = f a
这让我可以做一些像
这样的事情let x = getData
$: sort
$: group
$: aggregate
而不是
let x = aggregate
$ group
$ sort
$ getData
我最近了解到Clojure内置了类似的内容(我不太了解Clojure,但我认为它会写成(-> getData sort group aggregate)
?)这让我想知道Haskell是否也内置了它。 Hoogle doesn't have any results虽然。
是否有包含类似内容的标准库?如果我有这样一个共同的部分是特殊的,那么它可能会让我的代码很难让别人阅读。
答案 0 :(得分:22)
没有内置的内容,但Control.Category.(>>>)
已关闭:它是flip (.)
,所以你可以写
f x = x $: sort $: group $: aggregate
作为
f = sort >>> group >>> aggregate
($:)
组合子no shortage of definitions and names。我认为函数往往比简单的应用程序更适合管道样式,所以我觉得它没有什么需要; (>>>)
虽然有点难看。
(此外,Haskell的非严格语义意味着数据流不一定在箭头指向的方向;毕竟,aggregate
可以在sort
之前提供第一个构造函数有机会看看这个论点。所以我倾向于使用(.)
和($)
;我习惯了订单。)
答案 1 :(得分:3)
您正在描述的反向应用程序运算符现在是base
的标准包infixl 1
(自4.8.0)的一部分。
请注意,此运算符的优先级低于您建议的运算符($.ajax({
url : document.location.protocol + '//ajax.googleapis.com/ajax/services/feed/load?v=1.0&num=10&callback=?&q=' + encodeURIComponent('FEED URL'),
dataType : 'json',
success : function (data) {
if (data.responseData.feed && data.responseData.feed.entries) {
//PRINT THE CONTENT
console.log(data.responseData.feed.entries)
$.each(data.responseData.feed.entries, function (i, e) {
$('<div class="inner"></div>').appendTo('#feed');
$(".inner").attr('data-role','collapsible');
$(".inner").append("<h2>"+e.title+"</h2>");
$(".inner").append("<p>"+e.content+"</p>");
$(".inner").collapsible();
//console.log("------------------------");
//console.log("title : " + e.title);
//console.log("author : " + e.author);
//console.log("description: " + e.content);
});
}
}
});
)。
答案 2 :(得分:1)
Hackage中有一个名为Flow(https://hackage.haskell.org/package/flow-1.0.10/docs/Flow.html)的库,由Taylor Fausak根据这个确切需求创建。
它使用|>
运算符(受F#启发)作为线程最后一个。
例如:
3 |> succ |> recip |> negate
-0.25