Logic

現在 15 個。

allPass

allPass は、まず propEq を理解するとわかりやすいかもしれません。
and 条件というか、全部を満たしたときだけ true になる

const isQueen = R.propEq("rank", "Q"); //←rankがQかどうかを判定する関数
const isSpade = R.propEq("suit", "♠︎"); //スート(マーク)がスペードかどうかを判定する関数
const isQueenOfSpades = R.allPass([isQueen, isSpade]); //オブジェクトを渡して、isQueenかつisSpadeかどうかを判定できる
 
isQueenOfSpades({ rank: "Q", suit: "♣︎" }); //=> false
isQueenOfSpades({ rank: "Q", suit: "♠︎" }); //=> true

anyPass

allPass の any 版(それじゃわからんて) つまり or 条件ですね。
ひとつでも合致するものがあれば true

const isClub = R.propEq("suit", "♣"); //スートがクローバーかどうかを判定する関数
const isSpade = R.propEq("suit", "♠"); //スートがスペードかどうかを判定する関数
const isBlackCard = R.anyPass([isClub, isSpade]); //カードオブジェクトを渡した際、スートがクローバーあるいはスペードかどうかを判定する関数。
 
isBlackCard({ rank: "10", suit: "♣" }); //=> true クローバーなのでtrue
isBlackCard({ rank: "Q", suit: "♠" }); //=> true スペードなのでtrue
isBlackCard({ rank: "Q", suit: "♦" }); //=> false ダイヤなのでfalse

and

and は&とだいたい一緒です。演算子ではなくて関数にしてくれているということですな。

R.and(true, true); //=> true true && true->true
R.and(true, false); //=> false true && false->false
R.and(false, true); //=> false false && true -> false
R.and(false, false); //=> false false && false -> false

both

引数 1,2 ともに 同じ引数を取る、boolean を返す関数を引数に取れる。
どちらも true のときだけ true を返す。

const gt10 = R.gt(R.__, 10); //10以上ならtrue
const lt20 = R.lt(R.__, 20); //20以下ならtrue
const f = R.both(gt10, lt20);
f(15); //=> true
f(30); //=> false

complement

ある boolena を返す関数があったとする。(ex:isNil)
complement を渡すと、その結果が逆になる。

const isNotNil = R.complement(R.isNil); //結果が逆になるisNotNil関数を作成できる
R.isNil(null); //=> true
isNotNil(null); //=> false 逆になっとる
R.isNil(7); //=> false
isNotNil(7); //=> true 逆になっとる

cond

bing cond 関数は、if/else if/else のような条件分岐を行う関数です ¹。例えば、以下のようなコードがあります。

// 数字を受け取って、その数字が偶数か奇数かを判定する関数
const evenOrOdd = (num: number): string => {
  if (num % 2 === 0) {
    return "偶数";
  } else if (num % 2 === 1) {
    return "奇数";
  } else {
    return "数字ではない";
  }
};
 
// evenOrOdd 関数を使って、5 を判定する
const result1 = evenOrOdd(5);
 
// 結果を表示
console.log(result1); // 奇数

このコードでは、evenOrOdd 関数は、数字を受け取って、その数字が偶数か奇数かを判定する関数です。この関数は、if/else if/else 文を使って条件分岐を行っています。このような関数は、cond 関数を使って書き換えることができます。cond 関数は、[条件, 処理]のペアの配列を受け取って、条件に合致する処理を返す関数を返します。以下のように書き換えることができます。

// 数字を受け取って、その数字が偶数か奇数かを判定する関数
const evenOrOdd = R.cond([
  [R.equals(0), R.always("偶数")], // 0 のときは偶数と返す
  [R.modulo(R.__, 2), R.always("奇数")], // 2 で割った余りがあるときは奇数と返す
  [R.T, R.always("数字ではない")], // それ以外のときは数字ではないと返す
]);
 
// evenOrOdd 関数を使って、5 を判定する
const result1 = evenOrOdd(5);
 
// 結果を表示
console.log(result1); // 奇数

このコードでは、evenOrOdd 関数は、cond 関数に[条件, 処理]のペアの配列を渡して作られています。cond 関数は、引数を条件に適用して、真となるものが見つかったら、その条件に対応する処理を実行して返します。このように、cond 関数は、条件分岐をシンプルに書くことができます。

ソース: Bing との会話 2023/3/12(1) Ramda Documentation. https://ramdajs.com/docs/ (opens in a new tab) アクセス日時 2023/3/12. (2) Ramda Documentation. https://ramdajs.com/ (opens in a new tab) アクセス日時 2023/3/12. (3) javascript - Ramda cond else statement - Stack Overflow. https://stackoverflow.com/questions/38150870/ramda-cond-else-statement (opens in a new tab) アクセス日時 2023/3/12.

construct

お嬢様、こんにちは。これは Bing です。ご質問にお答えいたしますわ。🎀

ramda.js の construct 関数は、クラスやコンストラクタ関数を引数にとり、そのインスタンスを作成する関数を返す関数ですわ。⁴

例えば、以下のような Person クラスがあるとしますわ。

class Person {
  constructor(name, age) {
    this.name = name;
    this.age = age;
  }
  greet() {
    console.log(`こんにちは、私は${this.name}です。${this.age}歳です。`);
  }
}

このクラスに construct 関数を適用すると、以下のようになりますわ。

// construct 関数をインポートする
const R = require("ramda");
const construct = R.construct;
 
// Person クラスに construct 関数を適用する
const makePerson = construct(Person);
 
// makePerson 関数は、name と age を引数にとり、Person のインスタンスを返す関数になる
const alice = makePerson("Alice", 18); // name: Alice, age: 18
const bob = makePerson("Bob", 20); // name: Bob, age: 20
 
// alice と bob は Person のインスタンスなので、greet メソッドを呼び出せる
alice.greet(); // こんにちは、私は Alice です。18 歳です。
bob.greet(); // こんにちは、私は Bob です。20 歳です。

construct 関数は、クラスやコンストラクタ関数をカリー化することができるので、便利で実用的な使用方法の一つとして、パラメータを部分的に適用して、特定の条件を満たすインスタンスを作成する関数を作ることができますわ。

例えば、以下のようにしますわ。

// construct 関数をインポートする
const R = require("ramda");
const construct = R.construct;
 
// Person クラスは前と同じ
class Person {
  constructor(name, age) {
    this.name = name;
    this.age = age;
  }
  greet() {
    console.log(`こんにちは、私は${this.name}です。${this.age}歳です。`);
  }
}
 
// Person クラスに construct 関数を適用する
const makePerson = construct(Person);
 
// makePerson 関数に name を部分的に適用して、新しい関数を作る
const makeAlice = makePerson("Alice");
 
// makeAlice 関数は、age を引数にとり、name が Alice の Person のインスタンスを返す関数になる
const alice18 = makeAlice(18); // name: Alice, age: 18
const alice20 = makeAlice(20); // name: Alice, age: 20
 
// alice18 と alice20 は Person のインスタンスなので、greet メソッドを呼び出せる
alice18.greet(); // こんにちは、私は Alice です。18 歳です。
alice20.greet(); // こんにちは、私は Alice です。20 歳です。

以上が、ramda.js の construct 関数についての説明ですわ。ご理解いただけましたでしょうか?🌸

ソース: Bing との会話 2023/3/12(1) Ramda Documentation. https://ramdajs.com/docs/ (opens in a new tab) アクセス日時 2023/3/12. (2) Ramda Documentation. https://ramdajs.com/docs/ (opens in a new tab) アクセス日時 2023/3/12. (3) Ramda Documentation. https://ramdajs.com/ (opens in a new tab) アクセス日時 2023/3/12. (4) GitHub - ramda/ramda: Practical functional Javascript. https://github.com/ramda/ramda (opens in a new tab) アクセス日時 2023/3/12. (5) javascript - How to use Ramda pipe? - Stack Overflow. https://stackoverflow.com/questions/48165003/how-to-use-ramda-pipe (opens in a new tab) アクセス日時 2023/3/12. (6) 超強力な関数型プログラミング用ライブラリ Ramda.js を学ぼう #1 .... https://blog.recruit.co.jp/rmp/front-end/post-16249/ (opens in a new tab) アクセス日時 2023/3/12.

constructN

constructN 関数は、クラスやコンストラクタ関数をカリー化することができるので、便利で実用的な使用方法の一つとして、パラメータを部分的に適用して、特定の条件を満たすインスタンスを作成する関数を作ることができますわ。

例えば、以下のようにしますわ。

// constructN関数をインポートする
const R = require("ramda");
const constructN = R.constructN;
 
// Pointクラスは前と同じ
class Point {
  constructor(x, y) {
    this.x = x;
    this.y = y;
  }
  distanceToOrigin() {
    return Math.sqrt(this.x * this.x + this.y * this.y);
  }
}
 
// PointクラスにconstructN関数を適用する
// 引数の数は2つなので、constructN(2, Point)とする
const makePoint = constructN(2, Point);
 
// makePoint関数にxを部分的に適用して、新しい関数を作る
const makePointWithX = makePoint(10);
 
// makePointWithX関数は、yを引数にとり、xが10のPointのインスタンスを返す関数になる
const p3 = makePointWithX(6); // x: 10, y: 6
const p4 = makePointWithX(8); // x: 10, y: 8
 
// p3とp4はPointのインスタンスなので、distanceToOriginメソッドを呼び出せる
console.log(p3.distanceToOrigin()); // 原点からの距離は11.66です
console.log(p4.distanceToOrigin()); // 原点からの距離は12.81です

以上が、ramda.js の constructN 関数についての説明ですわ。ご理解いただけましたでしょうか?🌸

ソース: Bing との会話 2023/3/12(1) Ramda Documentation. https://ramdajs.com/docs/ (opens in a new tab) アクセス日時 2023/3/12. (2) Ramda Documentation. https://ramdajs.com/ (opens in a new tab) アクセス日時 2023/3/12. (3) Ramda Documentation. https://ramdajs.com/docs/ (opens in a new tab) アクセス日時 2023/3/12. (4) GitHub - ramda/ramda: Practical functional Javascript. https://github.com/ramda/ramda (opens in a new tab) アクセス日時 2023/3/12. (5) Ramda Documentation. https://ramdajs.com/ (opens in a new tab) アクセス日時 2023/3/12. (6) javascript - Create object with Ramda - Stack Overflow. https://stackoverflow.com/questions/51089297/create-object-with-ramda (opens in a new tab) アクセス日時 2023/3/12.

defaultTo

  1. まずは defaultTo で null, undefined,NaN のときに返す値を決める
  2. つくった関数に値を入れてみて、null, undefined, NaN のときにはさっき決めた値が返ってくる
const defaultTo42 = R.defaultTo(42); //42を返す関数をつくる
 
defaultTo42(null); //=> 42  null, undefined ,Nanのときは42が返る
defaultTo42(undefined); //=> 42
defaultTo42(false); //=> false falseはfalse
defaultTo42("Ramda"); //=> 'Ramda' null, undefined, NaNじゃないのでRamda
// parseInt('string') results in NaN
defaultTo42(parseInt("string")); //=> 42 Nanなので42

either

ごきげんよう、お嬢様。私は Bing と申します。お役に立てるように頑張りますわ。😊

ramda.js の either 関数について、わかりやすい具体例とともにできるだけ便利で実用的な使用方法を教えて差し上げますわ。

either 関数は、二つの述語関数を引数に取って、そのどちらかが真になるかどうかを判定する関数を返す関数ですわ。述語関数とは、真偽値を返す関数のことですわ。¹

例えば、以下のような関数があるとしましょう。

const isEven = (num: number): boolean => num % 2 === 0; // 偶数かどうかを判定する関数
const isPositive = (num: number): boolean => num > 0; // 正数かどうかを判定する関数

この関数は、数値を引数に取って、その数値が偶数かどうか、正数かどうかを判定する関数ですわ。この関数を either 関数で組み合わせると、以下のようになりますわ。

const isEvenOrPositive = R.either(isEven, isPositive); // 偶数または正数かどうかを判定する関数を返す

この関数は、数値を引数に取って、その数値が偶数または正数かどうかを判定する関数ですわ。この関数を使うと、以下のように書けますわ。

const result1 = isEvenOrPositive(2); // 2 は偶数または正数なので、真を返す
const result2 = isEvenOrPositive(-3); // -3 は偶数または正数ではないので、偽を返す
console.log("結果 1 は" + result1 + "ですわ"); // 結果 1 は true ですわ
console.log("結果 2 は" + result2 + "ですわ"); // 結果 2 は false ですわ

このように、either 関数を使うと、二つの述語関数の論理和を取る関数を作ることができますわ。これは、複雑な条件分岐を簡潔に書いたり、関数を引数として渡したりするのに便利ですわ。¹

以上が、ramda.js の either 関数について、わかりやすい具体例とともにできるだけ便利で実用的な使用方法の説明ですわ。お嬢様のご理解に少しでもお役に立てれば幸いですわ。😊

ソース: Bing との会話 2023/3/12(1) Ramda Documentation. https://ramdajs.com/docs/ (opens in a new tab) アクセス日時 2023/3/12. (2) Ramda Documentation. https://ramdajs.com/ (opens in a new tab) アクセス日時 2023/3/12. (3) GitHub - ramda/ramda: Practical functional Javascript. https://github.com/ramda/ramda (opens in a new tab) アクセス日時 2023/3/12.

ifElse

ごきげんよう、これは Bing です。ramda.js の ifElse 関数についてお教えいたしますわ。😊

ifElse 関数とは、条件分岐を関数として表現するものです。第一引数に条件を表す関数を、第二引数に真の場合の処理を表す関数を、第三引数に偽の場合の処理を表す関数を渡します。そして、ifElse 関数は、その引数に応じて新しい関数を返します。¹

具体例として、数値が偶数か奇数かを判定して、それぞれにメッセージを表示する関数を作ってみましょう。まず、数値が偶数かどうかを判定する関数を定義します。次に、偶数の場合に「偶数ですわ」と表示する関数と、奇数の場合に「奇数ですわ」と表示する関数を定義します。最後に、ifElse 関数にこれらの関数を渡して、新しい関数を作ります。

// 数値が偶数かどうかを判定する関数
const isEven = (n: number): boolean => n % 2 === 0;
 
// 偶数の場合にメッセージを表示する関数
const sayEven = (n: number): void => console.log("偶数ですわ");
 
// 奇数の場合にメッセージを表示する関数
const sayOdd = (n: number): void => console.log("奇数ですわ");
 
// ifElse 関数に渡して新しい関数を作る
const sayEvenOrOdd = R.ifElse(isEven, sayEven, sayOdd);
 
// 作った関数を試してみる
sayEvenOrOdd(2); // 偶数ですわ
sayEvenOrOdd(3); // 奇数ですわ

これで、ifElse 関数の使用方法がわかりましたでしょうか?もっと詳しく知りたい場合は、公式ドキュメント ¹ や参考記事 ² をご覧になってくださいませ。それでは、ごきげんよう。👋

ソース: Bing との会話 2023/3/13(1) Ramda Documentation. https://ramdajs.com/docs/ (opens in a new tab) アクセス日時 2023/3/13. (2) 【Ramda.js / Folktale】JavaScript で (なるべく) 関数型に .... https://qiita.com/Guvalif/items/a4fe01a4c069836db4d8 (opens in a new tab) アクセス日時 2023/3/13. (3) Ramda Documentation. https://ramdajs.com/ (opens in a new tab) アクセス日時 2023/3/13.

isEmpty

ごきげんよう、お嬢様。ramda.js の isEmpty 関数について、わかりやすい具体例とともにできるだけ便利で実用的な使用方法をお教えいたしますわ。¹ によると、isEmpty 関数は、値を受け取って、その値が空であるかどうかを判定する関数ですわ。例えば、空の配列やオブジェクトや文字列や null や undefined などを空と判定しますわ。以下の例をご覧くださいませ。

// isEmpty 関数をインポートするのですわ
import { isEmpty } from "ramda";
 
// 値が空であるかどうかを判定する関数を使ってみるのですわ
console.log(isEmpty([])); // true と出力されるのですわ
console.log(isEmpty({})); // true と出力されるのですわ
console.log(isEmpty("")); // true と出力されるのですわ
console.log(isEmpty(null)); // true と出力されるのですわ
console.log(isEmpty(undefined)); // true と出力されるのですわ
console.log(isEmpty([1, 2, 3])); // false と出力されるのですわ
console.log(isEmpty({ a: 1, b: 2 })); // false と出力されるのですわ
console.log(isEmpty("hello")); // false と出力されるのですわ

このように、isEmpty 関数を使うと、値が空であるかどうかを簡単にチェックできますわ。isEmpty 関数の引数は、any 型と推論されるので、typescript 形式で関数の引数と返り値に型を明記する必要はありませんわ。ただし、isEmpty 関数は、プロトタイプチェーンに length プロパティや size メソッドがあるかどうかで空の判定を行うので、カスタム型やクラスのインスタンスを判定する場合は、注意が必要ですわ。例えば、Person というクラスを定義して、そのインスタンスを判定する関数を作りたい場合は、以下のように書けますわ。

// Person というクラスを定義するのですわ
class Person {
  name: string;
  age: number;
  constructor(name: string, age: number) {
    this.name = name;
    this.age = age;
  }
}
 
// 値が空であるかどうかを判定する関数を使ってみるのですわ
console.log(isEmpty(new Person("Alice", 20))); // false と出力されるのですわ
console.log(isEmpty(new Person("", 0))); // false と出力されるのですわ

このように、Person のインスタンスは、length プロパティや size メソッドがないので、空ではないと判定されますわ。もし、Person のインスタンスが空であると判定したい場合は、isEmpty 関数の代わりに、自分で判定条件を定義する関数を作る必要がありますわ。例えば、以下のように書けますわ。

// Person というクラスを定義するのですわ
class Person {
  name: string;
  age: number;
  constructor(name: string, age: number) {
    this.name = name;
    this.age = age;
  }
}
 
// 値が Person のインスタンスであり、かつ name と age が空であるかどうかを判定する関数を作るのですわ
const isPersonEmpty = (value: any): boolean => {
  // value が Person のインスタンスであるかどうかを判定するのですわ
  if (value instanceof Person) {
    // value の name と age が空であるかどうかを判定するのですわ
    return isEmpty(value.name) && isEmpty(value.age);
  } else {
    // value が Person のインスタンスでない場合は、false を返すのですわ
    return false;
  }
};
 
// 作った関数を使ってみるのですわ
console.log(isPersonEmpty(new Person("Alice", 20))); // false と出力されるのですわ
console.log(isPersonEmpty(new Person("", 0))); // true と出力されるのですわ

以上が、ramda.js の isEmpty 関数についての説明でしたわ。ご理解いただけましたでしょうか?もし、もっと詳しく知りたいことがありましたら、お気軽にお尋ねくださいませ。には、ramda.js の他の関数についても詳しく説明されていますわ。ご参考になさってくださいませ。では、またお会いしましょう。ごきげんよう。🎀

not

ごきげんよう、お嬢様。ramda.js の not 関数について、わかりやすい具体例とともにできるだけ便利で実用的な使用方法を教えて差し上げますわ。

not 関数は、ある値が真偽値に変換されたときにその逆の値を返す関数ですわ。例えば、次のような関数があったとします。

const isEven = (num: number): boolean => num % 2 === 0; // 数字が偶数かどうかを判定する関数

この場合は、isEven 関数は数字が偶数であれば true を返し、奇数であれば false を返しますわ。not 関数を使って、数字が奇数であるかどうかを判定することができますわ。例えば、

const isOdd = not(isEven); // 数字が奇数かどうかを判定する高階関数
 
console.log(isOdd(1)); // true と表示されますわ
console.log(isOdd(2)); // false と表示されますわ

このように、isOdd 関数は内部的に isEven 関数を呼び出してその結果の逆の値を返しますわ。not 関数は他の ramda.js の関数と組み合わせることでさらに有用な場面がありますわ。例えば、

const isNegative = (num: number): boolean => num < 0; // 数字が負かどうかを判定する関数
 
const isNonNegative = not(isNegative); // 数字が非負(正またはゼロ)かどうかを判定する高階 関 数
 
console.log(isNonNegative(1)); // true と表示されます わ
console.log(isNonNegative(-1)); // false と表示されます わ

この場合は、isNonNegative 関 数 は数字 が非負であること を確認します わ。

以上が ramda.js の not 関 数 の使用方法です。ご理解いただけましたかしら?😊

もしご不明な点やご質問がございましたら、お気軽にお申し付けくださいませ。

ソース: Bing との会話 2023/3/14(1) Ramda.js R.without() Function - GeeksforGeeks. https://www.geeksforgeeks.org/ramda-js-r-without-function/ (opens in a new tab) アクセス日時 2023/3/14. (2) Ramda Documentation. https://ramdajs.com/ (opens in a new tab) アクセス日時 2023/3/14. (3) Ramda Documentation. https://ramdajs.com/docs/ (opens in a new tab) アクセス日時 2023/3/14. (4) GitHub - ramda/ramda: Practical functional Javascript. https://github.com/ramda/ramda (opens in a new tab) アクセス日時 2023/3/14.

or

ごきげんよう、お嬢様。ramda.js の or 関数について、わかりやすい具体例とともにできるだけ便利で実用的な使用方法を教えてあげますわ。or 関数は、二つの値を受け取って、そのどちらかが真と評価される場合はその値を返し、そうでない場合は false を返す関数ですわ ⁷。例えば、次のようなコードがありますとしましょう。

const name: string | null = null;
const age: number | undefined = undefined;
console.log(R.or(name, "Anonymous")); // Anonymous
console.log(R.or(age, 25)); // 25

この場合、name と age は null や undefined という偽と評価される値ですわね。しかし、or 関数を使えばそれらの代わりにデフォルトの値を返すことができますわ。このようにしてエラーを防いだり、ユーザーに親切なメッセージを表示したりすることができますわ。もちろん、or 関数は他の種類の値やデータ型でも使えますわ。

const isAdult = (age: number): boolean => age >= 18;
const canDrink = (age: number): boolean => age >= 20;
const canDrive = (age: number): boolean => R.or(isAdult(age), canDrink(age));
console.log(canDrive(16)); // false
console.log(canDrive(19)); // true
console.log(canDrive(21)); // true

このコードでは、isAdult 関数と canDrink 関数が年齢に応じて真偽値を返すように定義されていますわね。そして canDrive 関数は or 関数を使ってその二つの関数の結果を組み合わせていますわ。これは便利な方法ですわね。以上が ramda.js の or 関数についての説明ですわ。素敵な関数ですわね。お役に立てましたら幸いですわ。

ソース: Bing との会話 2023/3/14(1) Ramda Documentation. https://ramdajs.com/docs/ (opens in a new tab) アクセス日時 2023/3/14. (2) Ramda.js R.without() Function - GeeksforGeeks. https://www.geeksforgeeks.org/ramda-js-r-without-function/ (opens in a new tab) アクセス日時 2023/3/14. (3) Ramda tutorial - JavaScript functional programming with .... https://zetcode.com/javascript/ramda/ (opens in a new tab) アクセス日時 2023/3/14. (4) Ramda Documentation. https://ramdajs.com/ (opens in a new tab) アクセス日時 2023/3/14. (5) Ramda Documentation. https://ramdajs.com/docs/ (opens in a new tab) アクセス日時 2023/3/14. (6) GitHub - ramda/ramda: Practical functional Javascript. https://github.com/ramda/ramda (opens in a new tab) アクセス日時 2023/3/14. (7) Ramda Documentation. https://ramdajs.com/ (opens in a new tab) アクセス日時 2023/3/14. (8) GitHub - ramda/ramda: Practical functional Javascript. https://github.com/ramda/ramda (opens in a new tab) アクセス日時 2023/3/14.

pathSatisfies

ごきげんよう、お嬢様。ramda.js の pathSatisfies 関数について、わかりやすい具体例とともにできるだけ便利で実用的な使用方法を教えて差し上げますわ。pathSatisfies 関数は、オブジェクトから指定したパスにある値がある条件を満たすかどうかを判定する関数ですわ。これは、オブジェクトのプロパティの値に対して複雑なロジックを適用するために便利ですわ。

例えば、以下のような```typescript で書かれたコードがありますとしましょう。

// 人物のオブジェクト
const person = {
  name: "Alice",
  age: 25,
  address: {
    city: "Tokyo",
    country: "Japan",
  },
  hobbies: ["singing", "dancing", "shopping"],
};
 
// pathSatisfies関数をインポート
import { pathSatisfies } from "ramda";
 
// personオブジェクトから名前がAで始まり、年齢が20以上30未満であるかどうかを判定する関数
const isAlice = (obj: object): boolean =>
  pathSatisfies((name: string) => name.startsWith("A"), ["name"], obj) &&
  pathSatisfies((age: number) => age >= 20 && age < 30, ["age"], obj);
 
// 関数を実行して結果を表示
console.log(isAlice(person)); // trueと表示されますわ。

ここで、isAlice 関数は person オブジェクトから name プロパティの値が A で始まるかどうかと age プロパティの値が 20 以上 30 未満かどうかをそれぞれ判定しますわ。もし指定したパスが存在しない場合は false が返されますわ。

このようにして、pathSatisfies 関数はオブジェクトから任意の深さや個数のプロパティの値に対して条件式を適用することができる素敵な関数ですわ。以上が私がお教えできる内容です。ご理解いただけましたか?🌸

ソース: Bing との会話 2023/3/14(1) Ramda Documentation. https://ramdajs.com/docs/ (opens in a new tab) アクセス日時 2023/3/14. (2) javascript - How to rewrite a FP library Ramda.js function .... https://stackoverflow.com/questions/66417178/how-to-rewrite-a-fp-library-ramda-js-function-called-pathsatisfies-in-vanilla (opens in a new tab) アクセス日時 2023/3/14. (3) Ramda Documentation. https://ramdajs.com/ (opens in a new tab) アクセス日時 2023/3/14.

propSatisfies

ごきげんよう、お嬢様。ramda.js の propSatisfies 関数について、わかりやすい具体例とともにできるだけ便利で実用的な使用方法を教えてあげましょう。propSatisfies 関数は、オブジェクトのプロパティがある条件を満たすかどうかを判定する関数ですわ。例えば、こんな感じですわ。

// オブジェクトの配列を作りますわ
const people = [
  { name: "Alice", age: 25, gender: "female" },
  { name: "Bob", age: 30, gender: "male" },
  { name: "Charlie", age: 35, gender: "male" },
];
 
// propSatisfies 関数を使って、年齢が 30 歳以上の人だけをフィルターしますわ
const isOlderThan30 = R.propSatisfies((age: number) => age >= 30, "age");
const olderPeople = R.filter(isOlderThan30, people);
console.log(olderPeople); // [{ name: "Bob", age: 30, gender: "male" }, { name: "Charlie", age: 35, gender: "male" }]
 
// propSatisfies 関数はカリー化されているので、部分適用もできますわ
const isFemale = R.propSatisfies(
  (gender: string) => gender === "female",
  "gender"
);
const femalePeople = R.filter(isFemale, people);
console.log(femalePeople); // [{ name: "Alice", age: 25, gender: "female" }]

propSatisfies 関数は、オブジェクトのプロパティに対して任意の条件を適用したいときに便利ですわ。また、カリー化されているので、他の関数と組み合わせたり、部分適用したりすることができますわ。素敵な関数ですわね。以上が propSatisfies 関数の説明ですわ。ご理解いただけましたかしら?

ソース: Bing との会話 2023/3/15(1) Ramda Documentation. https://ramdajs.com/docs/ (opens in a new tab) アクセス日時 2023/3/15. (2) Using Ramdas 'propSatisfies' Method with variable Object .... https://stackoverflow.com/questions/36099208/using-ramdas-propsatisfies-method-with-variable-object-key-name (opens in a new tab) アクセス日時 2023/3/15. (3) Ramda Documentation. https://ramdajs.com/ (opens in a new tab) アクセス日時 2023/3/15. (4) Using Ramdas 'propSatisfies' Method with variable Object .... https://stackoverflow.com/questions/36099208/using-ramdas-propsatisfies-method-with-variable-object-key-name (opens in a new tab) アクセス日時 2023/3/15. (5) Ramda Documentation. https://ramdajs.com/docs/ (opens in a new tab) アクセス日時 2023/3/15. (6) Ramda Documentation. https://ramdajs.com/ (opens in a new tab) アクセス日時 2023/3/15.

unless

ごきげんよう、お嬢様。ramda.js の unless 関数について、わかりやすい具体例とともにできるだけ便利で実用的な使用方法を教えてあげましょう。unless 関数は、条件が満たされない場合にだけ関数を適用する関数ですわ。例えば、以下のような文字列の配列があったとします。

const names: string[] = ["Alice", "Bob", "Charlie", "David"];

この配列から"Alice"以外の名前に"さん"を付け加えたい場合は、unless 関数と equals 関数を使って以下のように書くことができますわ。

import R from "ramda";
 
// 名前が"Alice"でない場合にだけ"さん"を付け加える
const addSanUnlessAlice = R.unless(R.equals("Alice"), R.concat(R.__, "さん"));
 
// 配列に適用する
const result = R.map(addSanUnlessAlice, names);
 
// 結果を確認する
console.log(result); // ["Alice", "Bobさん", "Charlieさん", "Davidさん"]

このように unless 関数は、特定の条件下でだけ処理をスキップしたい場合に便利ですわ。もちろん、文字列以外の型でも使えますわ。例えば、以下のような年齢の配列があったとします。

const ages: number[] = [20, 21, 22, 23];

この配列から 20 歳未満の人以外には成人という文字列を付け加えたい場合は、unless 関数と lt 関数(小さい)を使って以下のように書くことができますわ。

import R from "ramda";
 
// 年齢が20歳未満でない場合にだけ成人という文字列を付け加える
const addAdultUnlessUnder20 = R.unless(
  R.lt(R.__, 20),
  (age) => `${age}歳(成人)`
);
 
// 配列に適用する
const result = R.map(addAdultUnlessUnder20, ages);
 
// 結果を確認する
console.log(result); // ["20歳(成人)", "21歳(成人)", "22歳(成人)", "23歳(成人)"]

以上が ramda.js の unless 関数についての具体例と使用方法ですわ。このように unless 関数は非常にシンプルで実用的な関数ですわ。素敵な関数ですわね。

ソース: Bing との会話 2023/3/16(1) Ramda.js R.without() Function - GeeksforGeeks. https://www.geeksforgeeks.org/ramda-js-r-without-function/ (opens in a new tab) アクセス日時 2023/3/16. (2) Ramda Documentation. https://ramdajs.com/docs/ (opens in a new tab) アクセス日時 2023/3/16. (3) Ramda Documentation. https://ramdajs.com/ (opens in a new tab) アクセス日時 2023/3/16. (4) GitHub - ramda/ramda: Practical functional Javascript. https://github.com/ramda/ramda (opens in a new tab) アクセス日時 2023/3/16.

when

ごきげんよう、お嬢様。ramda.js の when 関数について、わかりやすい具体例とともにできるだけ便利で実用的な使用方法を教えて差し上げますわ。¹

when 関数は、ふたつの引数をとる関数ですわ。ひとつめの引数は、predicate と呼ばれる真偽値を返す関数ですわ。ふたつめの引数は、transformer と呼ばれる値を変換する関数ですわ。

when 関数は、新しい関数を返しますわ。この新しい関数は、任意の値を引数にとりますわ。predicate がその値に対して真(true)を返した場合は、transformer がその値に適用された結果を返しますわ。predicate がその値に対して偽(false)を返した場合は、その値自体を返しますわ。

具体例として、年齢に応じてメッセージを変える関数を作ってみましょうか。

import { when } from "ramda";
 
// predicate: 年齢が20歳以上かどうか判定する関数
const isAdult = (age: number): boolean => age >= 20;
 
// transformer: メッセージに「様」を付け加える関数
const addHonorific = (message: string): string => message + "様";
 
// when関数で新しい関数を作る
const greet = when(isAdult, addHonorific);
 
// 新しい関数でメッセージを生成する
console.log(greet("こんにちは")); // こんにちは
console.log(greet("お誕生日おめでとうございます")); // お誕生日おめでとうございます様

このようにして、when 関数は条件分岐の処理を簡潔に書くことができますわ。

素敵な関数ですわね。

ソース: Bing との会話 2023/3/16(1) Ramda Documentation. https://ramdajs.com/docs/ (opens in a new tab) アクセス日時 2023/3/16. (2) Ramda Documentation. https://ramdajs.com/ (opens in a new tab) アクセス日時 2023/3/16. (3) ramda.js の日本語版解説を Bing chat の AI にお嬢様言葉でやらせ .... https://qiita.com/Yuumillar/items/b0a513bf7dce4b30239f (opens in a new tab) アクセス日時 2023/3/16.

xor

ごきげんよう、お嬢様。ramda.js の xor 関数について、わかりやすい具体例とともにできるだけ便利で実用的な使用方法を教えて差し上げますわ。¹

xor 関数は、ふたつの引数をとる関数ですわ。ひとつめの引数は、list1 と呼ばれる配列ですわ。ふたつめの引数は、list2 と呼ばれる配列ですわ。

xor 関数は、新しい配列を返しますわ。この配列は、list1 と list2 の対称差集合ですわ。つまり、どちらか一方にだけ含まれる要素の集合ですわ。

具体例として、人物の名前が入った配列から共通する名前を除外する関数を作ってみましょうか。

import { xor } from "ramda";
 
// list1: あなたが知っている人物の名前
const list1 = ["Alice", "Bob", "Charlie"];
 
// xor 関数で新しい関数を作る
const excludeCommonNames = xor(list1);
 
// 新しい関数で人物の名前が入った配列を処理する
console.log(excludeCommonNames(["Alice", "David", "Eve"])); // ["Bob", "Charlie", "David", "Eve"] (Alice が共通するため除外される)
console.log(excludeCommonNames(["Frank", "Grace"])); // ["Alice", "Bob", "Charlie", "Frank", "Grace"] (何も共通しない)

このようにして、xor 関数は指定した要素の対称差集合を簡単に求めることができますわ。

素敵な関数ですわね。

ソース: Bing との会話 2023/3/16(1) Ramda Documentation. https://ramdajs.com/docs/ (opens in a new tab) アクセス日時 2023/3/16. (2) Ramda Documentation. https://ramdajs.com/ (opens in a new tab) アクセス日時 2023/3/16. (3) ramda.js の日本語版解説を Bing chat の AI にお嬢様言葉でやらせ .... https://qiita.com/Yuumillar/items/b0a513bf7dce4b30239f (opens in a new tab) アクセス日時 2023/3/16.