2015-11-25 256 views
1

在介紹性的Haskell文本中,瞭解您對Haskell的好作,作者定義了一個函數applyTwice,兩次將函數f應用於參數x以說明更高階功能範式的核心功能。瞭解高階函數類型聲明

applyTwice :: (a -> a) -> a -> a 
applyTwice f x = f (f x) 

到目前爲止,我發現Haskell的類型聲明是清晰的,但是這個特殊的例子讓我感到困惑。我認爲這是一個更好理解類型聲明的機會。

作者指出這個構造「表示第一個參數是一個函數,它接受某些東西並返回相同的東西,第二個參數也是該類型的東西,返回值也是相同的類型。 (text

這種類型聲明是什麼意思?爲什麼不使用(a - > a) - > a,每個 - >表示某種轉換?

回答

3

在每個->之間是函數參數的類型,最後一個是函數返回值的類型。所以這裏的形狀是_ -> _ -> _(一個函數帶兩個參數)。但第一個參數恰好是一個函數,並且形狀爲_ -> _(帶一個參數)。

所以使用applyTwice

  • 傳遞一個函數,鑑於當a將返回a
  • 傳遞一個a
  • 得到a作爲結果
+0

?或者,等價地,傳遞一個函數,當給定一個'a'時將返回一個'a',並得到一個函數,當給定一個'a'時將返回一個'a'。 – user2407038

2

你應該東西a -> b作爲一個功能,需要一個a並輸出一個b - 所以如果f是這樣一個功能:f :: a -> b然後每次你給它一個v :: a(寫作f v),你會得到一個b(f v) :: b

現在當然這樣的功能型是太 - 高階...;)

現在(a -> a) -> a -> a(a -> a) -> (a -> a)所以這是一個功能(姑且稱之爲applyTwice),其當給定f :: a -> a將產生另一個功能a -> aapplyTwice f :: a -> a這當然是取v :: a然後f (f a)應用f兩次)的函數。

如果你必須以某種方式從a -> a類型的函數,它是真正棘手產生a另一方面也要(a -> a) -> a(想一想:你在哪裏得到的a從您可以養活f