簡體   English   中英

如何處理像Yesod這樣的Haskell框架中的類型

[英]How do I get a handle on the types in a Haskell framework like Yesod

我對Haskell相對較新,並試圖通過使用Yesod框架構建網站來獲得一些經驗。 我現在面臨的最大的困難是我經常不確定一個函數需要什么類型或者另一個函數返回什么類型。 我也無法解釋出錯時產生的類型錯誤。

特別是,我希望能夠做到以下幾點,但我目前還不知道如何做到這一點。

  • 給出一個表達式,找出表達式的類型。 通常我會使用GHCi這樣的東西,但據我所知,如果我想這樣做,我需要知道表達式的每個部分來自哪個包,我不知道該怎么做。 我還希望能夠檢查從模板Haskell生成的HomeR等函數的類型。 有沒有辦法使用GHCi來檢查Yesod項目的.hs文件中出現的任意表達式的類型或者?
  • 與上面相同的行,給定一個出現在Yesod項目的某個.hs文件中的類型或類,得到它的定義?
  • 給定Yesod函數或類型,快速找到它的文檔。 我目前所做的是在Google上搜索給定的功能,但這有點煩人,因為第一個結果並不總是文檔,有時它是舊版本。 有沒有一種快速查找Yesod文檔的有效方法?

你問過幾個問題,所以我會嘗試單獨回答每個問題:

(1)找到表達式的類型

您不需要知道包名稱,只需要知道模塊名稱。 如果您只使用Yesod函數,在GHCi提示符下import Yesod將導入它的大部分功能。 除此之外,您將不得不使用(3)查找並導入表達式的所有必要模塊。

(2)獲取項目中定義的符號的定義

如果您使用像vim或emacs這樣的編輯器,則可以為項目生成TAGS,然后使用編輯器基於TAGS的跳轉到定義功能。 要從GHCi為所有已加載的模塊生成標記,可以使用以下命令之一

:ctags  -- ctags for vim
:etags  -- etags for emacs

如果要為整個項目生成標記,可以使用標記生成器,例如hasktags 還有一個關於此的Haskell Wiki頁面

如果您在GHCi中加載了定義的模塊,您還可以使用:i符號來查找它的定義位置:

Prelude> :i maybe
maybe :: b -> (a -> b) -> Maybe a -> b  -- Defined in `Data.Maybe'

(3)查找hackage包中定義的符號的文檔

你可以使用Hayoo 它索引了大部分hackage,我還沒有找到任何它沒有索引的包(除了GHC API文檔,但這不是hackage)。 或者,還有Hoogle ,它也可以搜索給定類型簽名的函數,但它不會索引所有的hackage。 特別是,Yesod似乎不在其索引中。

你已經有了一些關於如何查找文檔的好答案,所以我只想提一下處理混亂類型錯誤的小技巧。

我發現將錯誤的函數分解為許多小的函數是有幫助的,這些函數都是在頂層引入的。 當問題僅僅是運算符優先級問題時,這可能會立即解決,但有時會出現更深層次的問題。

然后,您可以在已損壞的函數上刪除類型注釋,將其定義更改為undefined ,並將其加載到ghci中。 這通常會允許ghci推斷出組件函數的正確類型,並且您可以使用:t找到該類型。 為簡單的子組件函數設置正確的類型通常會直接導致正確的實現,之后您可以根據需要替換類型注釋和/或重新組合事物。

這里演示了一個更有原則的方法來讓Haskell幫助您找到正確類型的子組件: http//matthew.brecknell.net/post/hole-driven-haskell/

暫無
暫無

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

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