정의상 concat
은 단지 2개의 요소 A
를 조합합니다. 몇 개라도 조합이 가능할까요?
concatAll
함수는 다음 값을 요구합니다:
- semigroup 인스턴스
- 초기값
- 요소의 배열
import * as S from 'fp-ts/Semigroup'
import * as N from 'fp-ts/number'
const sum = S.concatAll(N.SemigroupSum)(2)
console.log(sum([1, 2, 3, 4])) // => 12
const product = S.concatAll(N.SemigroupProduct)(3)
console.log(product([1, 2, 3, 4])) // => 72
문제. 왜 초기값을 제공해야 할까요?
예제
Javascript 기본 라이브러리의 유명한 함수 몇가지를 concatAll
으로 구현해봅시다.
import * as B from 'fp-ts/boolean'
import { concatAll } from 'fp-ts/Semigroup'
import * as S from 'fp-ts/struct'
const every = <A>(predicate: (a: A) => boolean) => (
as: ReadonlyArray<A>
): boolean => concatAll(B.SemigroupAll)(true)(as.map(predicate))
const some = <A>(predicate: (a: A) => boolean) => (
as: ReadonlyArray<A>
): boolean => concatAll(B.SemigroupAny)(false)(as.map(predicate))
const assign: (as: ReadonlyArray<object>) => object = concatAll(
S.getAssignSemigroup<object>()
)({})
문제. 다음 인스턴스는 semigroup 법칙을 만족합니까?
import { Semigroup } from 'fp-ts/Semigroup'
/** 항상 첫 번째 인자를 반환 */
const first = <A>(): Semigroup<A> => ({
concat: (first, _second) => first
})
문제. 다음 인스턴스는 semigroup 법칙을 만족합니까?
import { Semigroup } from 'fp-ts/Semigroup'
/** 항상 두 번째 인자를 반환 */
const last = <A>(): Semigroup<A> => ({
concat: (_first, second) => second
})