簡體   English   中英

列表推導是否是Haskell的主要部分?

[英]Are list comprehensions a major part of Haskell?

在購買了Real World Haskell這本書之前,我查看了網上的各種Haskell資源。 在其他方面非常出色,它似乎沒有包含我在所看到的各個網站中提到的列表推導的任何內容。 這可能只是因為出於某種原因它們在編寫良好的Haskell中通常未被使用,或者它是否更復雜? 例如,奇怪的語法可能只是我尚未見過的運算符的一些合並。

列表理解在第12章中簡要提及。

我發現自己使用地圖和過濾器的組合比Haskell中的列表推導更頻繁,但在Python中我會更頻繁地使用列表理解。 所以我認為它的一部分是個人風格。

一旦您了解了如何使用列表理解的每個部分,您還可以在列表理解方面學到更多內容嗎? 您有輸入,條件/警衛以及返回列表的功能應用程序。 我並沒有真正看到書中需要大量關於列表理解的部分。

Haskell的定義是擁有一小組核心語言功能,並由一組豐富的語法選擇所包圍。 列表理解是一種選擇,但它們並沒有提供RWH花費整本書構建直覺的monad糖也沒有提供。 在很多情況下,Haskell為同一個東西提供了兩種語法,let to where,case和combinator面向編程風格,以及列表推導和monad sugar。

列表理解最初是作為monad理解實現的,這一事實在“98年的偉大單形化革命”(又名Haskell '98)中發生了變化。 實際上,.NET語言中LINQ的設計源於舊的monad理解設計。 列表推導可能比它們更加通用,但是故意削弱它們以使它們更容易理解錯誤消息。

鑒於紙張數量有限,您必須選擇要強調的材料,並且RWH避免在大多數情況下討論它們,因此您不會陷入將列表視為特殊情況的陷阱。

也就是說,在第12章中簡要提到了它們。到那時,已經為潛在的概念建立了足夠的直覺,它們並不是真正的危險。

最后,這本書的名字是Real World Haskell。 它希望教你良好的現實世界編程技巧。 許多Haskellers(不是全部)避免列表理解,因為符號不能很好地擴展,並且因為最終,你可能想要回來並改進monad變換器或其他東西,並且最終會重寫整個monadic中的理解代碼無論如何風格。

[更新:現在GHC重新獲得了monad的理解,這個異議並不像以前那么強烈。 你可以從中獲得一些有趣的新功能。]

列表推導主要出現在小型列表處理示例中,其中許多旨在明顯地具有數學風格。 當您開始涉及Real World Haskell所涵蓋的較大應用程序時,列表處理按比例占代碼的一小部分。 如上所述,使用mapfilterfoldzip通常也很方便,就像使用列表理解一樣。

所以

  • 在現實世界的Haskell程序中,只有一小部分代碼處理列表。

  • 使用列表解析編寫時,只有一小部分列表處理Haskell代碼顯得更好。

我寫的幾乎所有列表推導結果都產生了對列表。 但是,我不確定是否應該閱讀任何內容。

列表推導是用於綁定的語法糖(如在monad的綁定中)列表。

另一種語法糖就是做法。 Imho它更好,最重要的是它適用於所有monad。

如果列表推導不存在,我相信會少一點學習,沒有任何東西丟失(你可以使用do-notation)。

支持列表推導的論據是,它會使用戶更清楚它是一個列表。 Imho類型簽名對此更有效。

我在RWH中看到了三個列表理解的提及

暫無
暫無

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

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