2017-04-16 95 views
2

我無法理解Ramda docs的簽名。例如,如果你看一下map你看這你如何閱讀ramda文檔?

Functor f => (a → b) → f a → f b

我沒有看到這個模式是如何適應的例子:

var double = x => x * 2; 

R.map(double, [1, 2, 3]); //=> [2, 4, 6] 

本例中的仿函數是[1,2,3],所以請問是怎麼獲取f的簽名Functor f => (a → b) → f a → f b?另外,是什麼意思?

+0

最好去問這裏:。https://gitter.im/ramda/ramda – dfsq

回答

3

我在這裏給出一個簡短的答案,但更完整的一個分佈在a similar question的兩個答案中,而這個答案又取自Ramda wiki page。 (免責聲明:我該網頁的作者和Ramda本身的負責人之一。)

這分爲兩個部分:

Functor f => (a → b) → f a → f b 

脂肪箭頭前(=>)我們有約束其餘的。本例中的單個約束是變量f必須是Functor。 Functor是其成員具有遵守特定法律的map方法的類型。並且聲明是通過另一種類型參數化的,所以我們不寫f,但是f Stringf Number或更一般地,f a對於某些未知類型a

緊身箭頭(->)是Function類型的縮寫。因此,而不是寫

Function x y 

,我們可以代替寫

x -> y 

或在需要時以避免歧義。

(x -> y) 

把這些在一起,我們可以注意到,在R.map(double, [1, 2, 3]),我們從Number功能(double)到Number,這意味着我們的ab都是Number。而我們的函子是Array。因此,我們使map接受從NumberNumber的函數,並返回一個函數,該函數接收一個數組Number s並返回一個新的數組Number s。 (這是因爲在這個系統中,->綁定到右邊,所以(a -> b -> c)相當於(a -> (b -> c))。在Ramda中,所有函數都以這樣的方式進行curried,以便您可以用任何初始參數調用它們,直到所有項已經提供的,你繼續找回功能,因此與Ramda功能有R.map(double)([1, 2, 3])R.map(double, [1, 2, 3])之間沒有真正的區別

+0

是'功能xy'一樣的作爲'function x(){y}'? – stackjlei

+1

不,函數xy和它的簡寫形式'x - > y'表示一個函數,它接受一個'x'類型的參數並返回一個'y'類型。 'function(str){return str.length;}'具有'Function String Int'類型或更簡潔的'String - > Int'。 –

+1

當它接受2個字符串作爲參數並返回一個布爾值時,爲什麼propEq具有'String→a→Object→Boolean'的簽名?不應該是'string,string' - > boolean'嗎? – stackjlei