2013-08-19 16 views
3

我對Haskell相對較新,並試圖通過使用Yesod框架構建網站來獲得一些體驗。我現在面臨的最大的困難是我常常不確定一個函數需要什麼類型,或者另一個函數返回什麼類型。我也很難解釋我犯錯時產生的類型錯誤。如何獲得像Hasod這樣的Haskell框架中的類型的句柄

特別是,我希望能夠做以下事情,但我目前還不知道一個好辦法。

  • 給出一個表達式,找出表達式的類型。通常我會用GHCi做這樣的事情,但據我所知,如果我想這樣做,我需要知道表達式的每個部分來自哪個包,我不知道該怎麼做。我還希望能夠檢查從模板Haskell生成的函數的類型,例如HomeR。有沒有辦法使用GHCi檢查出現在Yesod項目的.hs文件中的任意表達式的類型或評估值?
  • 沿着上述相同的路線,給定一個類型或類出現在Yesod項目中的一些.hs文件中,得到它的定義?
  • 給定一個Yesod函數或類型,快速找到它的文檔。我目前所做的是在Google上搜索給定的功能,但這有點令人討厭,因爲第一個結果並不總是文檔,或者有時候是舊版本。是否有快速查找Yesod文檔的有效方法?
+1

你不應該需要知道哪些_package_的產品從GHCI使用它,您只需要知道要導入哪個_module_。 (當然,這不一定簡單得多......) – MathematicalOrchid

+1

關於你的第一個問題:如果你使用Vim,請查看[vim-hdevtools](https://github.com/bitc/vim-hdevtools)。它允許您通過按下按鈕來查看任何子表達式的類型。非常有價值。 – kqr

回答

3

你問幾個問題,所以我會盡力回答seperately他們每個人:

(1)找到一個表達

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

(2)獲取項目

定義符號的定義,如果你使用像vim或Emacs編輯器,可以生成代碼,爲您的項目,然後使用編輯器的跳轉到定義功能基於標籤。以產生由GHCI所有加載的模塊的標籤,你可以使用下面的命令

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

如果你想生成標籤爲一個整體項目中的一個,你可以使用一個標籤產生如hasktags。關於這一點還有一個Haskell Wiki Page

如果你有在GHCI加載的定義模塊,你也可以使用:我象徵找到它的定義的地方:

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

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

您可以使用Hayoo。它對大部分hackage進行索引,我還沒有找到它尚未索引的任何軟件包(除GHC API文檔外,不包括hackage)。 另外,還有Hoogle,它也能夠搜索給定類型簽名的函數,但它並不索引所有的hackage。尤其是,Yesod似乎並沒有進入索引。

1

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

我發現將我的不正確的功能分解爲許多小功能都很有幫助,這些小功能都是在頂層引入的。當這個問題僅僅是一個運營商優先問題時,這可能會立即解決,但有時候會有更深層次的問題。

然後,您可以刪除您的類型註釋在一個破損的函數上,將其定義更改爲undefined,並將其加載到ghci中。這通常會允許ghci爲你的組件函數推斷出正確的類型,並且你可以用:t找到該類型。爲簡單的子組件功能提供正確的類型通常會直接導致正確的實現,之後您可以根據需要替換類型註釋和/或重新編寫內容。

更爲原則的做法有哈斯克爾幫助你找到正確類型的子組件的證明這裏:http://matthew.brecknell.net/post/hole-driven-haskell/

+0

非常感謝鏈接! :) –

相關問題