2010-11-03 28 views
32

一個簡單的問題,Haskell中是否有一個運算符像美元符號一樣工作,但優先於左邊。 I.E.而不是

f (x 1) 

被寫成

f $ x 1 

我想它寫成

x 1 $ f 

這純粹是一種風格的東西。我按順序運行一系列函數,如果我可以將它們寫入左邊寫入以匹配我讀左邊寫入的內容,那將會很好。如果有這樣的運營商?

[更新]一對夫婦的人都問,如果我不能確定我自己。作爲回答,我想在重新發明車輪之前檢查是否有現有的操作員。

+4

這就像F#的管道組成運算符一樣。 (爲什麼它沒有內置到哈斯克爾)相關討論:http://stackoverflow.com/questions/1457140/haskell-composition-vs-fs-pipe-forward-operator – 2010-11-03 18:20:08

+0

它看起來像回答我的問題是「不」 。謝謝:) – 2010-11-03 18:26:33

+2

你意識到你在同一個表達式中結合了從左到右和從右到左的應用程序,不是嗎?我認爲大多數人都會因此而放棄。反向應用程序就是所謂的T-combinator。它幾年前經常用(#)表示,但現在#是GHC中的一個特殊符號,所以它已不再使用太多。 – 2010-11-03 18:30:58

回答

19

我不知道,是否有非標準操作,但什麼阻止你寫你自己的?這部作品在ghci的:

Prelude> let a $> b = b a 
Prelude> 1 $> (+2) 
3 
Prelude> sum [1, 2] $> (+2) 
5 
Prelude> map (+2) [1, 2] $> map (+3) 
[6,7] 

UPDATE:上hoogle搜索a -> (a -> b) -> b(這是該運營商的類型)沒有發現任何有用的。

+4

看來我會用這個,謝謝。一個英鎊對我來說對運營商有吸引力。 – 2010-11-03 18:27:35

+5

@Benjamin Confino:Puns總是令人愉快,但對於真實世界的使用,我建議考慮'|>'。如上所述,F#中的該運算符完全符合您的要求,因此使用相同的名稱將有助於人們更輕鬆地理解您的代碼。 – 2010-11-03 20:18:22

+2

Haskell的真正優勢之一就是你可以編寫自己的控制流操作符。 Haskell沒有「循環」構造?沒問題!只需寫你自己的。 – 2010-11-06 01:35:25

-1

你就不能重新定義$

let ($) x f = f x 

或者只是選擇不同的運營商,像$$

+3

重新定義一個標準的操作符並不是一個好主意。 – michau 2012-12-10 18:56:24

4

我不知道的任何標準版本,但用於在幾個地方爲此我已經看到了(#)。我想到的特別的一個是特定的,它使用它的成語,如:

someObject # someMessage param1 param2 

我似乎記得看到使用相同的方式#運營商等「面向對象」庫,但不記得多少或哪些。

+2

洗滌用途(#)。 Erik Meijer,Daan Leijen和James Hook用它來編寫MS Agent與Active Haskell(一個Haskell-COM橋)的腳本。可能最初的Haskell/ObjectiveC橋也被使用(#)。 – 2010-11-03 18:59:25

10

這個組合子在data-aviary包中定義(舌頭在臉頰):

Prelude Data.Aviary.BirdsInter> 1 `thrush` (+2) 
Loading package data-aviary-0.2.3 ... linking ... done. 
3 

雖然實際使用該軟件包是做一個相當愚蠢的事情,閱讀源的樂趣,並揭示了this combinator形成通過神奇的咒語flip id(或者,用鳥類學的說法,cardinal idiot)。

+4

'caridinalIdiot''是一個宏偉的combinator名字! – sclv 2010-11-04 14:05:31

24

在Haskell你可以使用flip改變參數任何二元函數或操作的順序:

ghci> let (|>) = flip ($) 
ghci> 3 |> (+4) |> (*6) 
42 
+0

非常漂亮的解決方案! – 2014-01-26 21:27:29