【发布时间】:2021-12-10 19:13:25
【问题描述】:
假设我有一个字符串列表,我想先按字符串长度然后按字母顺序对它们进行排序(因此列表中具有相同长度的字符串按字母顺序排序)。
我已经有ordString 可以用来按字母顺序排序。我可以为字符串长度创建自己的 Ord 实例:
import * as S from 'fp-ts/string'
import * as N from 'fp-ts/number'
import * as Ord from 'fp-ts/Ord'
const ordString = S.Ord
const ordStringLength = pipe(N.Ord, Ord.contramap((s: string) => s.length))
如果我想使用这些Ords 对我的列表进行排序,我可以调用A.sort 两次,但这似乎很浪费:
import * as A from 'fp-ts/Array'
const sorted = pipe(listOfStrings, A.sort(ordString), A.sort(ordStringLength))
有没有办法可以将ordString 和ordStringLength 实例组合成一个实例,可以在对A.sort 的一次调用中使用?
(这是一个人为的例子来证明我的问题;实际上排序更复杂,可能涉及组合几个Ords)
【问题讨论】:
-
我不确定,因为我不是
fp-ts用户,但我看到Ord有一个半组实例,这可能是你想要的 -
我认为这就是答案。现在只需要弄清楚如何构建适当的半群
标签: typescript functional-programming fp-ts