微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何使用 monoid concat 生成列表?

如何解决如何使用 monoid concat 生成列表?

我从事函数式编程已经有一段时间了,但我对幺半群和其他纯抽象不熟悉。我想知道是否有办法通过使用为幺半群定义的 concat 函数生成值列表?

例如,以 0 作为身份(单位)和 + 作为 concat,整数成为幺半群。如果我想要一个有序整数序列,我可以将 + 应用到我需要的第一个整数和 1(这将是这里的一个步骤),然后重复结果的过程等等在。这将生成一个类似 [1,2,3,4,5,...] 的列表。

类似地,对于更复杂的幺半群,如果定义了事件幺半群,并使用特殊值作为身份和 concat,这样它需要两个事件并产生一个保持相同间隔的新事件,我可以有一系列 { {1}}(因此间隔为 10 分钟)。

我的问题是:是否有任何标准模式/抽象/方法可以通过将 [ Event(Today,12:00),Event(Today,12:10),12:20) ] 应用于前一项和步骤/间隔来生成此类序列?我正在使用 concat 库,我试图找到可以做到的东西,但没有任何运气。我可以使用 fp-ts 生成一组值,但此函数仅将一个值传递给回调,而我需要两个值才能使 unfold 工作

解决方法

此函数只向回调传递一个值,而我需要两个值才能使 concat 工作

以下是来自 unfold 模块的 Array 类型:

export declare const unfold: <A,B>(b: B,f: (b: B) => O.Option<readonly [A,B]>) => A[]

虽然看起来 B 只能是“一个值”,但您始终可以返回一个元组,以便您可以访问 f 中的多个值。

fp-ts does not currently support infinite lists,下面是一个使用 length 参数限制结果大小的示例:

import * as A from 'fp-ts/Array'
import {none,some} from 'fp-ts/Option'
import type {Monoid} from 'fp-ts/Monoid'

const concatList = <M>(M: Monoid<M>) => (step: M) => (length: number): M[] =>
  A.unfold<M,[M,number]>([M.empty,0],([prev,currentLength]) => {
    if (currentLength === length) return none
    const next = M.concat(prev,step)
    return some([next,[next,currentLength + 1]])
  })

用法:

import {MonoidSum} from 'fp-ts/number'

concatList(MonoidSum)(1)(5) // [1,2,3,4,5]
concatList(MonoidSum)(3)(5) // [3,6,9,12,15]

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。