2013-05-31 152 views
3

我在回顧我的Haskell編程課程中的一箇舊考試,我似乎無法將我的頭圍繞此函數(我認爲這裏給出的信息太少)。舊考試中Haskell功能的解釋

給出的代碼是

myId x = x 

function n f 
| n > 0 = f . function (n-1) f 
| otherwise = myId 

我知道,如果我例如調用該函數與輸入2 (*2),我會得到一個功能的結果。如果我打電話給(-2) (*2) 1,我會得到結果1

我只是不知道如何?此外,我無法圍繞函數的類型轉換我的頭。

我知道這兩個選項是正確的,但我不明白爲什麼(可能是括號,這使我目前困惑)。

function :: (Num a, Ord a) => a -> (a -> a) -> a -> a 
function :: (Num a, Ord b) => a -> (b -> b) -> b -> b 

任何人都可以清楚我應該如何「讀」這個功能,我應該怎樣理解類型轉換工程(如何在閱讀我的編程在Haskell文學和學習你Haskell的,但在圈已經持續了幾天)。

回答

5

function需要一些號碼n和功能f :: a -> a,並構成該函數與自身n倍,返回a -> a類型的另一功能。將返回的函數應用於類型爲a的值時,結果基本上與以循環n次執行f相同,並將每個前一步的輸出用作下一個的輸入。

也許是更容易看到的相似,如果最後一個參數是由明確的:

function :: (Ord a, Num a) -> a -> (b -> b) -> b -> b 
function n f x 
    | n > 0  = f (function (n-1) f x) 
    | otherwise = x 

這是功能上等同於function免費的點。

在Haskell,函數f :: a -> b -> c可以被解釋爲任一或「的函數,它接受一個a並返回一個函數從bc」,「接受一個ab並返回一個c一個函數」。將函數應用於一個或多個輸入時,將每個輸入視爲消除函數參數中的一個。在這種情況下,function 10返回類型爲(a -> a) -> a -> a的新函數,function 2 (*2)返回類型爲Num a => a -> a的函數。

當你這樣想,它應該很清楚爲什麼function (-2) (*2) 1返回一個數字,而function 2 (*2)返回一個函數。沒有類型轉換正在進行;當您將三個參數function應用於兩個輸入時,由於您沒有提供計算該值所需的最終輸入,因此會返回另一個函數而不是值。

+1

非常感謝。完全得到它(最後點連接:D) – Anticipating

+0

你沒有解釋爲什麼第二種類型是正確的。 :) –