如何理解Haskell中的函式呼叫

時間 2021-06-02 17:32:54

1樓:

並不是你想的語法糖,按照你的思路,只返回的函式咋辦?

事實是這是一種叫柯里化的東西, 用必應會谷歌自行查詢 Currying Function

事實上,對於Haskell ,很多地方與一般的面相過程與物件的語言是不一樣的。

2樓:UWRF

對於「a b 是函式嗎?」,a 和 b 是什麼不重要,但 a 和 b 的型別需要一致,且為 Ord 型別類的例項。對於「返回了什麼」這一點,可以認為是返回了乙個單引數函式。

這個函式取 b 作為引數,返回了 a 和 b 中的較大值。

首先,函式在 Haskell 中是第一類值

Haskell functions are first class entities, which means that they

can be given names

can be the value of some expression

can be members of a list

can be elements of a tuple

can be passed as parameters to a function

can be returned from a function as a result

Function - HaskellWiki

這意味著 Haskell 中的函式能夠被賦予名字、成為表示式的值、成為列表的成員、成為元組的元素、能作為引數傳遞給函式、也能作為函式的結果返回

以及,Haskell 預設柯里化。柯里化就是把多引數函式處理成接受乙個引數,返回乙個接受下乙個引數的函式的形式。

In Haskell, all functions are considered curried: That is, all functions in Haskell take just one argument.

Currying - HaskellWiki

(上面兩個鏈結對題主的問題已經有了詳細的解釋,而下面我的闡釋也和鏈結頁面的內容類似)

以 C 為例,如果我們自己寫乙個 max 函式,其宣告看起來也許是這個樣子的:

double

max(

doublea,

doubleb);

而在 Haskell 當中,max 的型別則是:

max::

Orda

=>a->a->a忽略型別約束,僅從字面上讀一下的話,似乎是 max 接受兩個型別為 a 的引數,返回型別為 a 的結果。

型別簽名中的 (->) 是右結合的,意味著我們可以這麼看這個型別簽名:

max::

Orda

=>a->(a

->a)

讀作 max 接受乙個型別為 a 的引數,返回型別為 a -> a 的函式。而這才是 Haskell 對函式的處理方式。因為 Haskell 函式應用是左結合的,所以對於 max x y 而言,max x 的結果——就是那個型別是 a -> a 的函式——會接著應用到 y 上,並返回結果,或者說 max x y 和 (max x) y 是一樣的。

可以在 GHCi 中分步寫,並把引數型別明確標註:

Prelude

>letstep1

=max(2

::Int

)Prelude

>:t

step1

step1

::Int

->IntPrelude

>step155

Prelude

>:t

itit

::Int

step1 就是 max 2 返回的內容。

關於為什麼要柯里化,柯里化有什麼好處:

函式為什麼要Currying化,currying化有什麼優點? - 程式語言

如何理解這兩個函式的區別(Haskell)?

其實沒區別,區別是編譯器造成的,有個叫CAF 的東西,必應谷歌或者Haskell Wiki 中搜尋 Haskell CAF,第二個中的 x 破壞了這個,編譯器,在 O0 下會自動優化 當然,在不要這個 優化的方式就是備忘錄法,memorization,對於第乙個,當你計算第n個數的時候,時間複雜度是...

haskell中的immutable array是如何實現隨機訪問的?

已登出 我印象中 Data.Vector 是乙個 32 個格仔然後可以往下擴充套件的乙個樹,Date.Vector.Mutate 是乙個利用定長陣列實現的 ST Monad 憑印象回答,很可能有錯 Tang Boyun 已經有答案給出Haskell常用的幾個庫,但如果追求極致效能的話,C陣列依舊是最...

Haskell 中如何描述 product 作為 的 category?

張智浩 首先這個問題表述確實不大清楚,至少不是嚴格的數學語言 或者說不大精確 我把問題重新表述如下 此處快速回憶範疇的定義,略 或可參見維基百科 性質 對任意三個物件 復合對映 是同構。不精確的問題 若乙個範疇滿足性質 我們能對它說些什麼嗎?從某些 可能沒用的 經驗來看,這種問題一般就取特殊值就完了...