簡體   English   中英

為什么是$! 運算符右關聯?

[英]Why is the $! operator right-associative?

我只是在學習Haskell,而且我還不完全清楚何時以及如何嚴格評估

當我想要一個函數來嚴格評估它的參數時,我發現自己在寫作

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

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

f $! x $! y $! z

並讓它做我想要的?

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

它反映了$的固定性。 你可以為$$!做一個非常好的案例$! 有錯誤的固定性。

爭論

我從2008年在haskell-prime找到了一個提出$$! 運算符左關聯:

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

反對該提案只有一個論點:“這會打破很多代碼”。

贊成的論點

相反,有四個支持左聯想($)論據 ,最后一個與你的相同,並被認為是最重要的。 簡而言之,它們是:

  • 0)給定表達式fxy ,有兩個應用程序,我們就可以編寫f $ x $ y

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

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

    因此,使用組合編寫這樣的管道更好,因為它可以更容易地清理代碼

  • 2)除了用(。)消除的括號之外,左關聯($)允許你消除更多的括號,例如:

    f (gx) (hy) ==> f $ gx $ hy

  • 3)你的論點: $!的正確聯想版本$! 不方便,因為產生如下: ((f $! x) $! y) $! z ((f $! x) $! y) $! z而不是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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM