2014-05-20 30 views
9

我想寫類似:我如何可以聲明內定義的函數的類型讓

f :: (a -> b) -> a -> c -> b 
f g = 
    let inner :: a -> c -> b 
     inner x y = g x 
    in inner 

但是這給了我一個error.because它不承認,我想引用以與聲明中相同的「a」和「b」類型作爲f

我該如何明確地給出適當的內部類型?

+5

您將需要擴展名'ScopedTypeVariables',並且您可能還需要爲您的簽名添加一個明確的'bora a b c .'。 – crockeea

+2

http://www.haskell.org/haskellwiki/Scoped_type_variables – didierc

+0

在這種特殊情況下,您實際上並不需要內部類型簽名,您甚至可以選擇以'f g = const形式編寫函數。 g'(或甚至'f =(const。)')來獲得相同的行爲。你甚至不需要外部類型簽名,GHC可以用const來正確地推斷它。 g'。 – bheklilr

回答

17

您需要擴展ScopedTypeVariables。您還需要爲您的簽名添加一個明確的forall a b c .,這表示綁定整個定義範圍的變量。要做到這一點

{-# LANGUAGE ScopedTypeVariables #-} 

f :: forall a b c . (a -> b) -> a -> c -> b 
f g = 
    let inner :: a -> c -> b 
     inner x y = g x 
    in inner 
+0

@luqui非常感謝,我不確定爲什麼這是必要的! – crockeea

5

的一種方法是通過使GA參數內,像這樣綁定的外部和內部類型....

f g = 
    let inner :: (a->b)->a -> c -> b 
     inner g x y = g x 
    in inner g 

這確實改變了你的結構略有雖然.. ..可能會否定首先有內在的理由,但在很多情況下(取決於較大的程序),這可能會有所幫助。

相關問題