2017-07-18 100 views
1

一個我試圖定義一個函數如下練習:Haskell的類型不明確

twice f x = f (f x) 

當我打印類型的兩次我看到:

Main> :t twice 
twice :: (a -> a) -> a -> a 

不知道我理解的在這裏輸出。因此twice需要輸入類型函數(類型爲a -> a)。它是否正確?如果是這樣,f如何評估爲功能類型(a -> a)?那麼這裏的twice的退貨類型是什麼?

回答

4
twice f   x = f (f x) 
twice :: (a -> a) -> a -> a 

它是這樣的。

fa -> a型的,x是a型的,f (f x)a類型。

你應該通過fa -> a功能,如* 2

+0

啊現在我明白了。那麼如何評估'f'的類型爲a-> a。口譯員是如何推斷它是什麼類型的?我沒有在任何地方定義'f'。 – patronus

+1

有人似乎在這裏問過類似的問題:https://stackoverflow.com/questions/42243902/haskell-function-type-clarification?rq=1 – patronus

1

是的,這是正確的。

f的類型爲a -> a

這需要x其中有一個類型的a,應該能夠再次使用他的輸出,所以輸出應該是相同類型的輸入。

twicef具有相同的輸出類型,因此a

這給了我們這樣的:

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