我想寫類似:我如何可以聲明內定義的函數的類型讓
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
我該如何明確地給出適當的內部類型?
我想寫類似:我如何可以聲明內定義的函數的類型讓
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
我該如何明確地給出適當的內部類型?
您需要擴展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
@luqui非常感謝,我不確定爲什麼這是必要的! – crockeea
的一種方法是通過使GA參數內,像這樣綁定的外部和內部類型....
f g =
let inner :: (a->b)->a -> c -> b
inner g x y = g x
in inner g
這確實改變了你的結構略有雖然.. ..可能會否定首先有內在的理由,但在很多情況下(取決於較大的程序),這可能會有所幫助。
您將需要擴展名'ScopedTypeVariables',並且您可能還需要爲您的簽名添加一個明確的'bora a b c .'。 – crockeea
http://www.haskell.org/haskellwiki/Scoped_type_variables – didierc
在這種特殊情況下,您實際上並不需要內部類型簽名,您甚至可以選擇以'f g = const形式編寫函數。 g'(或甚至'f =(const。)')來獲得相同的行爲。你甚至不需要外部類型簽名,GHC可以用const來正確地推斷它。 g'。 – bheklilr