簡體   English   中英

使用Ramda,你如何構成二進制函數?

[英]Using Ramda, how do you compose against binary functions?

Ramda提供與R.equals大小寫相等的區分,但是我想要一個不區分大小寫的相等測試。 R.compose還提供了R.compose ,但在R.compose組合中,假設最左邊的參數是一元的。

我想做的就像是

R.compose( R.equals(...), R.toLower )

但是,我想組成R.toLower上的二元函數R.equals

有沒有辦法實現這個目標? 類型喜歡

(b->b->c) -> (a->b) => (a->a->c)

我想要的是像Haskell的Data.Function.on這樣定義為

on buxy運行二進制函數b,將一元函數u應用於兩個參數xy 從相反的角度來看,它可以轉換兩個輸入並組合輸出。

編輯: R.useWith非常接近您正在尋找的:

接受函數fn和變換器函數列表,並返回一個新的curried函數。 當調用新函數時,它調用函數fn,其參數包括在新函數的連續參數上調用每個提供的處理程序的結果。

所以你可以像這樣定義你的函數:

const equalsi = R.useWith(R.equals, [R.toLower, R.toLower]);

例:

 const equalsi = R.useWith(R.equals, [R.toLower, R.toLower]); const check = (a, b) => console.log(`${a} = ${b}?`, equalsi(a, b)); check('aaa', 'aaa'); check('aaa', 'aa'); check('aAa', 'aaa'); check('aaa', 'aAa'); check('aba', 'aaa'); 
 <script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.26.0/ramda.min.js"></script> 

如果你想要的東西等同於哈斯克爾on功能,你別說,你可以定義一個如下:

 const on = (b, u) => R.useWith(b, [u, u]); const equalsi = on(R.equals, R.toLower); const check = (a, b) => console.log(`${a} = ${b}?`, equalsi(a, b)); check('aaa', 'aaa'); check('aaa', 'aa'); check('aAa', 'aaa'); check('aaa', 'aAa'); check('aba', 'aaa'); 
 <script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.26.0/ramda.min.js"></script> 


上一個答案

可能有更優雅的方式來做到這一點,但這有效:

const equalsi = R.unapply(R.compose(
    R.apply(R.equals),
    R.map(R.toLower)
));

打破它:

// [] -> Boolean
// Takes an array of two strings and returns true if they are equal
R.apply(R.equals)

// [] -> Boolean
// Takes an array of two strings, converts them to lowercase, and returns true
// if those lowercase strings are equal
R.compose(R.apply(R.equals), R.map(R.toLower))

// String -> String -> Boolean
// Takes two strings, converts them to lowercase, and returns true if those lowercase
// string are equal
R.unapply(R.compose(R.apply(R.equals), R.map(R.toLower)));

您還可以根據Ramda函數定義on函數,然后使用:

const on = (b, u) => R.unapply(R.compose(R.apply(b), R.map(u));

const equalsi = on(R.equals, R.toLower);

您還可以考慮使用eqBy

在其域中獲取一個函數和兩個值,如果值映射到codomain中的相同值,則返回true; 否則是假的。

R.eqBy(R.toLower, 'a', 'A'); //=> true

例:

 console.log(R.eqBy(R.toLower, 'a', 'A')) 
 <script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.26.0/ramda.min.js"></script> 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM