2012-09-22 55 views
7

我已經找到了,並在互聯網上的定義,但我無法找到和的實際執行情況。我在我的電腦上搜索過某種序列的haskell文件,但它沒有返回任何可以在文本編輯器中打開的文件。如何查看「和」的實現代碼?

回答

19

您可以使用Hoogle搜索Haskell函數,就像這樣:

http://www.haskell.org/hoogle/?hoogle=and

的功能鏈接將您帶到這裏定義的函數庫模塊,而在這種情況下,鏈接and需要我們在這裏:

http://hackage.haskell.org/packages/archive/base/latest/doc/html/Prelude.html#v:and

然後單擊Source鏈接的功能名稱的右側,並把它你到那個函數的來源。對於and的情況下,我們的鏈接到這裏:

http://hackage.haskell.org/packages/archive/base/latest/doc/html/src/GHC-List.html#and

and      :: [Bool] -> Bool 
or      :: [Bool] -> Bool 
#ifdef USE_REPORT_PRELUDE 
and      = foldr (&&) True 
or      = foldr (||) False 
#else 
and []   = True 
and (x:xs)  = x && and xs 
or []   = False 
or (x:xs)  = x || or xs 
#endif 

你會看到,and實際上有兩個定義。一種是標準前奏定義,只有在編譯時使用USE_REPORT_PRELUDE標誌才能啓用標準前奏定義,另一種是Prelude通常編譯時使用的定義,該定義通常會進行更優化。

+3

好奇心:有兩個定義有什麼意義? –

+1

@ChrisTaylor我不知道。我只是假設優化基本庫的人有一些很好的理由來輸入所有這些額外的字符。 –

+1

有趣的是,在該代碼之後有一個RULES編譯指示,它基本上告訴它僞裝成使用USE_REPORT_PRELUDE版本進行編譯/ foldr重寫 –

2

你不能指望在Haskell的本地發行版中找到源代碼 - 這可能是Haskell平臺。請轉至Hoogle並搜索該功能。其中一種方法是按照名稱搜索and,轉到其Haddock,然後單擊「源」。

在Hoogle上,您還可以按類型簽名進行搜索,即。 [Bool] -> Bool你可能會發現自己經常做的事。