Haskell从左到右运行

时间:2012-04-04 01:27:14

标签: haskell clojure

我有一个我经常使用的函数,它允许我以对我来说更自然的方式编写代码。

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虽然。

是否有包含类似内容的标准库?如果我有这样一个共同的部分是特殊的,那么它可能会让我的代码很难让别人阅读。

3 个答案:

答案 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