2012-02-05 105 views
1

這段代碼有什麼問題?Haskell高階函數需要幫助

addNum :: Int->Int-> Int 
addNum a b = a+b 

divideby :: (Int->Int -> Int) -> Int ->float 
divideby f z = f /z 

我想借此addNum功能作爲輸入divideby與除數,然後輸出答案。所以divideby函數應該作爲一個更高階的函數。

這段代碼有什麼問題?它給出以下錯誤:

*** Expression  : f/z 
*** Term   : f 
*** Type   : Int -> Int -> Int 
*** Does not match : Int 

回答

6

這意味着錯誤說的是什麼。您指定你的函數的類型是

divideby :: (Int->Int -> Int) -> Int ->float 

這意味着,第一個參數必須是一個函數,與該類型Int->Int -> Int,第二個輸入必須是Int,然後它會產生一個float。當然,Haskell不知道如何用Int來分割一個函數,這就是你告訴它如何使用表達式f/z


迴應評論:no。這不是一個更高階的函數,但它很接近。請看:

addNum :: Int -> Int -> Int 
addNum a b = a + b 

divideBy :: Int -> Int -> Int -> Int 
divideBy a b c = (addNum a b) `div` c 

divideBy是一個函數,它需要3個Int S作爲輸入,併產生一個Int。由於其輸入僅爲Int,因此它是而不是的高階函數。但是,您可以將addNum的使用抽象爲輸入,從而使其成爲高階函數。 addNum具有類型(Int -> Int -> Int),所以,除了我們已經投入,我們將盡我們的第一個輸入

divideBy :: (Int -> Int -> Int) -> Int -> Int -> Int -> Int 
divideBy f a b c = (f a b) `div` c 

的類型是一個高階函數,也編譯正確和有意義。 :)您可以通過addNum作爲此功能的輸入。

ghci> divideBy addNum 2 4 6 -- (2 + 4)/6 
1 
+0

這是正確的嗎?這是一個更高階的函數嗎? divideNo :: Int-> Int-> Int addNum a b = a + b divideby :: Int - > Int - > Int-> a divideby a b c =(addNum a b)'div' c} – user1150071 2012-02-05 07:18:08

1

floatFloat之間的差異......前者是一個類型變量,後者是一個具體類型(您幾乎肯定要Double代替)。

這與丹伯頓的答案有關。

1

i want to take addNum function as a Input in to divideby function with divide factor and then output the answer.

首先,divideby函數是一個函數,即需要2數fz並返回f/z。正如Dan Burton所說,如果divideby函數返回兩個Int值的除法,則無法獲得函數Int -> Int -> Int作爲參數。

所以它可能看起來像這樣:

divideby :: Int -> Int -> Float 
divideby f z = (fromIntegral f)/(fromIntegral z) 

如果你想建立一些功能的divideby疊加addNum,喜歡拍照addNum的結果爲divideby第一個參數,你可以那樣做:

newFunction :: Int -> Int -> Float 
newFunction a b = divideby (addNum a b) b 

其中實際上等於(a+b)/b