2015-05-09 22 views

回答

4

一個方便的技巧,我最近發現是結合使用輸入孔與asTypeOf

如果你有一些代碼確實編譯,你想知道在它表達的類型,有孔替換該表達式有時食堂的事情了,如:

  -- what is the type of this part, I wonder? 
f xs = 3 * length xs 

_報道更換length xs

foo.hs:1:12: Warning: 
    Found hole ‘_’ with type: a 
    Where: ‘a’ is a rigid type variable bound by 
       the inferred type of f :: t -> a at foo.hs:1:1 

length xs肯定不是a型的!

但是如果你使用asTypeOf,你可以離開length xs插入它必須具有相同的類型,因爲它一個洞:

f xs = 3 * (length xs `asTypeOf` _) 

現在,我們得到:

foo.hs:1:34: Warning: 
    Found hole ‘_’ with type: Int 

好多了。


asTypeOf是完全一樣const,在它返回其第一個參數和完全忽略它的第二位。然而它的類型強制第二個參數與第一個參數相同;它的設計是用反引號書寫的中綴。

它是專爲當你有一個多態的子表達式和GHC抱怨不明確的類型變量;你可以使用內聯類型聲明,但有時如果沒有ScopedTypeVariables擴展名,這是不可能的。如果有另一個正確類型的值,則可以使用asTypeOf從多態表達式中選擇適當的情況,而不更改表達式返回的值。

我在這裏使用它是從預期的情況「向後」我想要左邊的東西來限制右側的(被忽略的)洞的類型,而不是相反。

7

Typed holes!

foo x = length [x] + _ 

與GHC或裝載編譯成GHCI會給:

Found hole ‘_’ with type: Int 
Relevant bindings include 
    x :: a 
    foo :: a -> Int 
相關問題