簡體   English   中英

Haskell 函數組合 (.) 和函數應用 ($) 習語:正確使用

[英]Haskell function composition (.) and function application ($) idioms: correct use

我一直在閱讀Real World Haskell ,並且快要結束了,但是我一直在苦惱與(.)($)運算符有關的風格問題。

當你編寫一個由其他函數組成的函數時,你可以這樣寫:

f = g . h

但是當你在這些函數的末尾應用一些東西時,我是這樣寫的:

k = a $ b $ c $ value

但是這本書會這樣寫:

k = a . b . c $ value

現在,在我看來,它們在功能上是等效的,在我看來,它們的作用完全相同。 然而,我看得越多,我就越能看到人們以本書的方式編寫函數:首先使用(.)組合,然后僅在最后使用($)附加一個值來評估批次(沒有人這樣做)它帶有許多美元成分)。

是否有理由使用比使用所有($)符號更好的書籍方式? 或者這里有一些我沒有得到的最​​佳實踐嗎? 或者它是多余的,我根本不應該擔心它?

我想我可以從權威那里回答這個問題。

是否有理由使用比使用所有 ($) 符號更好的書籍方式?

沒有什么特別的原因。 Bryan 和我都喜歡減少線路噪音。 . $更安靜。 因此,本書使用了f . g . h $ x f . g . h $ x f . g . h $ x語法。

它們確實是等價的:請記住, $運算符本質上什么都不做。 f $ x計算為fx $的目的是它的固定行為:右結合和最小優先級。 刪除$並使用括號進行分組而不是中綴優先級,代碼片段如下所示:

k = a (b (c (value)))

k = (a . b . c) value

首選. 版本優於$版本與上面括號中的版本相比,兩者都更受歡迎:審美吸引力。

雖然,有些人可能想知道使用中綴運算符而不是括號是否基於某種潛意識的沖動,以避免與 Lisp 有任何可能的相似之處(開個玩笑……我想?)。

我會在f . g $ x添加它f . g $ x f . g $ x , f . g f . g是一個有意義的句法單位。

同時,在f $ g $ xf $ g不是一個有意義的單位。 一個$鏈可以說是更重要的——首先得到xg的結果,然后對它做f然后對它做foo然后等等。

同時一連串的. 可以說更具聲明性,並且在某種意義上更接近以數據流為中心的視圖——組合一系列函數,並最終將它們應用於某些東西。

對我來說,我認為答案是 (a) 正如唐所說的那樣整潔; (b) 我發現當我編輯代碼時,我的函數可能會以無點樣式結束,然后我要做的就是刪除最后一個$而不是返回並更改所有內容。 當然,這是一個小問題,但很好。

這個 haskell-cafe thread上有一個關於這個問題的有趣討論。 顯然有少數觀點認為$的正確結合性是“完全錯誤的” ,並選擇了f . g . h $ x f . g . h $ x f . g . h $ x超過f $ g $ h $ x是回避問題的一種方式。

這只是風格問題。 然而,這本書的方式對我來說更有意義。 它組合了所有函數,然后將其應用於值。

你的方法看起來很奇怪,最后一個$是不必要的。

不過,這真的無所謂。 在 Haskell 中,通常有很多很多正確的方法可以做同樣的事情。

我意識到這是一個非常古老的問題,但我認為還有另一個未提及的原因。

如果您要聲明一個新的無點函數f . g . h f . g . h f . g . h ,您傳入的值將被自動應用。 但是,如果您寫f $ g $ h ,它將不起作用。

我認為作者更喜歡組合方法的原因是因為它導致構建函數的良好實踐。

暫無
暫無

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

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