有人可以幫我解決以下問題嗎?
applyTwice :: (a -> a) -> a -> a
applyTwice f x = f (f x)
我不明白上面是如何作業的。如果我們有類似的東西,( 3) 10它肯定會產生13?那是怎么回事f (f x)。在查看高階函式時,基本上我不理解柯里化。
所以我不明白的是,如果說我們有一個函式,a -> a -> a它會接受一個輸入a然后產生一個函式,它期望另一個輸入 a 產生一個輸出。因此,如果我們add 5 3這樣做add 5會產生一個函式,該函式期望輸入3產生最終輸出8. 我的問題是這在這里是如何作業的。我們將一個函式作為輸入,那么部分函式應用程式在這里是否像它那樣作業,add x y或者我是否完全使一切變得過于復雜?
uj5u.com熱心網友回復:
這不是柯里化,這是部分應用。
> :t ( )
( ) :: Num a => a -> a -> a
> :t ( ) 3
( ) 3 :: Num a => a -> a
部分應用程式( ) 3確實產生了一個函式( 3)(*),它等待另一個數字輸入來產生它的結果。它這樣做,無論是一次還是兩次。
你的例子被擴展為
applyTwice ( 3) 10 = ( 3) (( 3) 10)
= ( 3) (10 3)
= (10 3) 3
這里的所有都是它的。
(*)(實際上是(3 ),但( 3)無論如何都是一樣的)。
正如chepner在評論中澄清的那樣(參考最少的復制編輯),
偏應用是由于函式只取一個引數,以及
(->)函式應用的右結合性和左結合性的組合而造成的一種錯覺。( ) 3并不是真正的部分應用程式。它只是 [一個常規] 應用( )到引數3。
因此,從其他更傳統的語言的角度來看,我們將其稱為柯里化和部分應用之間的區別。
但是從 Haskell 的角度來看,它確實是關于柯里化的,即一次將一個函式應用于其引數,直到其型別所指示的完全飽和(即a->a->a應用于一個a值的值成為一個a->a值,然后成為一個a值當a依次應用于一個值時)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/338421.html
