2014-05-09 47 views
3

我剛學Haskell和我還沒有何時以及如何嚴格評價被迫

當我想要一個函數嚴格評估其論據完全清楚我發現自己寫

((f $! x) $! y) $! z 

這看起來很奇怪。不應該$!是左聯想,所以我可以寫

f $! x $! y $! z 

並讓它做我想要的?

我完全誤解了$!運營商?

+1

爲什麼不用'$!'的反向固定性編寫一個函數'!$'來實現你想要的功能? – bheklilr

+0

問題是爲什麼函數還沒有以這種方式定義。我想知道,如果我這樣寫的願望反映了對Haskell工作方式的誤解。 – dspyz

+3

如果你剛剛學習Haskell,我認爲你不應該搞嚴格的應用程序。這很少需要。 – augustss

回答

4

措施反對

我發現了一個建議,從2008年哈斯克爾貸,使$$!運營左結合:

https://ghc.haskell.org/trac/haskell-prime/wiki/ChangeDollarAssociativity

只有一個反對這一提議的說法:「這會破壞代碼「lot」。

論點支持

相反,給出有利於左結合($),最後一個是和你一樣的四個參數,並認爲是最重要的。他們是,總之:給定的表達式f x y,有兩個應用

  • 0),我們將能夠寫f $ x $ y

  • 1)現在,用右結合($),我們可以寫f . g . h $ xf $ g $ h $ x

    但是:\x -> f $ g $ h $ x ==> f $ g $ h無效,

    以便寫入這種管道與組合物I因爲它允許更容易地清除代碼

  • 2)左聯合($)允許除了用(。)消除的括號外,還可以消除更多的括號。),例如:

    f (g x) (h y) ==> f $ g x $ h y

  • 3)你的論點:中$!正確關聯的版本是不方便的,因爲引起了諸如:((f $! x) $! y) $! z,而不是f $! x $! y $! z

結論

我支持使用在我們的代碼開頭重新定義它們的應用程序運算符的更好的左關聯版本,如下所示:

import Prelude hiding (($), ($!)) 

infixl 0 $, $! 
($), ($!) :: (a -> b) -> a -> b 
f $ x =   f x 
f $! x = x `seq` f x 
+1

舊版(2006),Haskell Cafe中的類似討論(他告訴:「$的結合性只是普通的錯誤「):http://www.mail-archive.com/[email protected]/msg12549.html – enrique

+0

要翻譯常規樣式'f $! g $!引用'$'的策略,需要一些嚴格的組合:'f。! g $! x'。我想知道:是否有這樣的操作符已經在庫中定義? –

+0

順便說一下,目前的'<$>'與當前傳統的'$'一致:'f <$> g''''似乎等於'f。 g <$> x'。但是,另一個「<$>」的左聯合版本沒有多大意義,因爲消費了幾個適用性參數被寫爲「f」或「f」或「f」或「f」應用'g')。看起來'<*>'已經是左聯合的(就像Haskell-prime中的'$'),並且優先級低於'<$>'。 –

9

這是鏡像$的固定性。對於$$!這兩個錯誤的固定性,您都可以做出非常好的判斷。

+0

什麼是$?我搜索了「haskell運算符」,但沒有任何第一對谷歌鏈接提到它(即使是包含haskell運算符列表的PDF文件)。我目前閱讀的這本書也沒有提到它(真實世界哈斯克爾)。是否有所有Haskell運算符的列表? – dspyz

+1

@dspyz http://stackoverflow.com/questions/940382/haskell-difference-between-dot-and-dollar-sign/1290727#1290727 –

+0

@dspyz你甚至會發現一個[鏈接到真正的世界哈斯克爾在托馬斯的評論中評論它在書中的使用](http://stackoverflow.com/questions/3030675/haskell-function-composition-and-function-application-idioms-correct-us)。 – bheklilr

相關問題